小鸡汤机器人之动弹自动回复
无聊想了一下怎样才可以搞一个机器人出来。分析了一下页面,就得出了以下代码。 功能比较弱,耗时无非就是正则的调试。 要做得比较复杂的话,需要做词性分析和词的统计了。当然,这不是本次讨论的重点。 本次已经同步添加了数据库表结构。PS:别拿来做坏事哦
无聊想了一下怎样才可以搞一个机器人出来。分析了一下页面,就得出了以下代码。
功能比较弱,耗时无非就是正则的调试。
要做得比较复杂的话,需要做词性分析和词的统计了。当然,这不是本次讨论的重点。
本次已经同步添加了数据库表结构。PS:别拿来做坏事哦。
项目的git地址:http://git.oschina.net/fallBirds/oscsend-chicken-soup
<?php require dirname(__FILE__) . '/Core.php'; /** * 发送鸡汤动弹 */ class reply extends Core { private $cookie = 'cookie.txt'; public function index() { $this->login(); $this->getContent(); } /** * 登录帐号 */ private function login() { $url = "https://www.oschina.net/action/user/hash_login"; /** * 填写你的帐号 */ $data = "email=&pwd=&verifyCode=&save_login=1"; $curl = curl_init(); // 启动一个CURL会话 curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); // 从证书中检查SSL加密算法是否存在 curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转 curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求 curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包 curl_setopt($curl, CURLOPT_COOKIEJAR, $this->cookie); // 存放Cookie信息的文件名称 curl_setopt($curl, CURLOPT_COOKIEFILE, $this->cookie); // 读取上面所储存的Cookie信息 curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环 curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回 curl_exec($curl); // 执行操作 curl_close($curl); // 关闭CURL会话 } /** * 获取内容 */ public function getContent() { $replyType = $this->replyType(); /** * 用户中心的地址。 ft=atme 就是@提醒的消息地址 */ $url = "http://my.oschina.net/u/2251019/?ft=atme"; $curl = curl_init(); // 启动一个CURL会话 curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址 curl_setopt($curl, CURLOPT_COOKIEFILE, $this->cookie); // 读取上面所储存的Cookie信息 curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环 curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回 $tmpInfo = curl_exec($curl); // 执行操作 curl_close($curl); // 关闭CURL会话 /** * 下面开始就是匹配 @提醒的用户和条件 */ preg_match_all('/<td class="TweetContent">([\s\S]+?)<\/td>/', $tmpInfo, $allContent); foreach ($allContent[0] as $key => $value) { /** * 先获取@提醒的唯一ID值 * 获取这个,用来跟数据库匹配是否已经存在了。 */ preg_match("/tweet_reply\((\d+)\)/", $value, $replyId); $recordId = preg_replace('/[^0-9]/', '', $replyId['0']); if ($this->exitReply($recordId)) { continue; } /** * 取名字 */ preg_match('/<a.*class="user">([\s\S]+?)<\/a>/', $value, $userName); $replyName = strip_tags($userName['0']); /** * 获取需要执行的指令 */ preg_match("/<div.*class='post'>([\s\S]+?)<\/div>/", $value, $cmd); foreach ($replyType as $k => $v) { /** * 匹配一下指令 * 组装需要回复的内容 * 从这块代码开始,可以做得搞基点 * 如:加入学习指令呀。当然,学习指令这个需要另外写一个方法。 * 嗯,当你写到这里会发现上面代码重复很多,必须进行精简封装了。 * 目前我只写到这里了,没写更深入的。 */ if (strpos($cmd[0], $v['type_name']) !== false) { $replyConten = ""; $replyConten .= "@{$replyName} "; $type = $this->getReplyType($v['type_name']); if (empty($type)) { $replyConten .= "非常抱歉,小鸡汤目前还没有找到符合的指令,你可以输入#学习#+内容让小鸡汤学习呀。"; } else { $replyConten .= $type['learn_reply']; } $this->doReply($replyConten); $this->recordReplySend($recordId, $replyName, $replyConten); } } } } /** * 回复类型 */ public function replyType() { $sth = $this->db->prepare("SELECT * FROM {$this->prefix}reply_type "); $sth->execute(); return $sth->fetchAll(); } /** * 最后的回复 */ private function exitReply($id) { $sth = $this->db->prepare("SELECT * FROM {$this->prefix}reply_record where record_id = :record_id "); $sth->execute(array('record_id' => $id)); return $sth->fetch(); } /** * 获取对应的回复内容 * @param type $type */ private function getReplyType($type) { $sth = $this->db->prepare("SELECT * FROM {$this->prefix}learn WHERE learn_title = :learn_title limit 1 "); $sth->execute(array('learn_title' => $type)); return $sth->fetch(); } /** * 发送鸡汤 * @todo 你看!这里的代码明显是重复了。 */ private function doReply($content) { sleep(2); $url = "http://my.oschina.net/action/tweet/pub"; $data = "user=&user_code=&attachment=0&code_brush=&code_snippet=&msg={$content}"; $curl = curl_init(); // 启动一个CURL会话 curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址 curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求 curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包 curl_setopt($curl, CURLOPT_COOKIEFILE, $this->cookie); // 读取上面所储存的Cookie信息 curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环 curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回 $tmpInfo = curl_exec($curl); // 执行操作 curl_close($curl); // 关闭CURL会话 } /** * 记录已经发送 */ private function recordReplySend($id, $user, $content) { $sql = "INSERT INTO {$this->prefix}reply_record(`record_id`, `user_name`, `content`) VALUES (:record_id, :user_name, :content)"; $sth = $this->db->prepare($sql); $sth->execute(array('record_id' => $id, 'user_name' => $user, 'content' => $content)); } } $mail = new reply(); $mail->index();
-- phpMyAdmin SQL Dump -- version 4.1.8 -- http://www.phpmyadmin.net -- -- Host: 127.0.0.1 -- Generation Time: 2014-10-21 09:35:46 -- 服务器版本: 5.6.15 -- PHP Version: 5.5.9 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00"; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; -- -- Database: `chicken` -- -- -------------------------------------------------------- -- -- 表的结构 `ck_learn` -- CREATE TABLE IF NOT EXISTS `ck_learn` ( `learn_id` int(11) NOT NULL AUTO_INCREMENT, `learn_title` varchar(255) NOT NULL, `learn_reply` varchar(255) NOT NULL, `learn_status` tinyint(1) NOT NULL, `learn_time` int(11) NOT NULL, PRIMARY KEY (`learn_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ; -- -------------------------------------------------------- -- -- 表的结构 `ck_post` -- CREATE TABLE IF NOT EXISTS `ck_post` ( `post_id` int(11) NOT NULL AUTO_INCREMENT, `post_page` int(11) NOT NULL COMMENT '采集页数', `post_content` text NOT NULL COMMENT '鸡汤内容', `post_send` tinyint(1) NOT NULL COMMENT '是否发送', `post_time` int(11) NOT NULL COMMENT '添加时间', PRIMARY KEY (`post_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=6971 ; -- -------------------------------------------------------- -- -- 表的结构 `ck_reply_record` -- CREATE TABLE IF NOT EXISTS `ck_reply_record` ( `reply_record_id` int(11) NOT NULL AUTO_INCREMENT, `record_id` bigint(20) NOT NULL, `user_name` varchar(128) NOT NULL, `content` varchar(255) NOT NULL, PRIMARY KEY (`reply_record_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统回复记录' AUTO_INCREMENT=22 ; -- -------------------------------------------------------- -- -- 表的结构 `ck_reply_type` -- CREATE TABLE IF NOT EXISTS `ck_reply_type` ( `reply_type_id` int(11) NOT NULL AUTO_INCREMENT, `type_name` varchar(128) NOT NULL, PRIMARY KEY (`reply_type_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Windows 回復環境 (WinRE) は、Windows オペレーティング システムのエラーを修復するために使用される環境です。 WinRE に入ると、システムの復元、出荷時設定へのリセット、アップデートのアンインストールなどを実行できます。 WinRE を起動できない場合、この記事では問題を解決するための修正方法を説明します。 Windows 回復環境を起動できない Windows 回復環境を起動できない場合は、以下の修正プログラムを使用してください。 Windows 回復環境のステータスを確認する 他の方法を使用して Windows 回復環境に入る Windows 回復パーティションを誤って削除しましたか?以下の Windows のインプレース アップグレードまたはクリーン インストールを実行します。これらすべての修正については詳しく説明しています。 1]Wiをチェックする

DDREASE は、ハード ドライブ、SSD、RAM ディスク、CD、DVD、USB ストレージ デバイスなどのファイル デバイスまたはブロック デバイスからデータを回復するためのツールです。あるブロック デバイスから別のブロック デバイスにデータをコピーし、破損したデータ ブロックを残して正常なデータ ブロックのみを移動します。 ddreasue は、回復操作中に干渉を必要としないため、完全に自動化された強力な回復ツールです。さらに、ddasue マップ ファイルのおかげでいつでも停止および再開できます。 DDREASE のその他の主要な機能は次のとおりです。 リカバリされたデータは上書きされませんが、反復リカバリの場合にギャップが埋められます。ただし、ツールに明示的に指示されている場合は切り詰めることができます。複数のファイルまたはブロックから単一のファイルにデータを復元します

iPhone の iMessage でスワイプして返信する方法 注: スワイプして返信機能は、iOS 17 の iMessage 会話でのみ機能し、メッセージ アプリでの通常の SMS 会話では機能しません。 iPhone でメッセージ アプリを開きます。次に、iMessage の会話に移動し、返信したい iMessage を右にスワイプします。これが完了すると、選択した iMessage に焦点が合い、他のすべてのメッセージは背景でぼやけます。返信を入力するためのテキスト ボックスと、チェックイン、場所、ステッカー、写真などの iMessage アプリにアクセスするための「+」アイコンが表示されます。メッセージを入力するだけで、

コンピューティングは、私たちのほとんどが直感的に理解できるよく知られた概念です。関数 f(x)=x+3 を例にとると、x が 3 のとき、f(3)=3+3 となります。答えは6で、とても簡単です。明らかに、この関数は計算可能です。ただし、一部の関数はそれほど単純ではなく、それらが計算できるかどうかを判断するのは簡単ではありません。つまり、最終的な答えが得られない可能性があります。 1928 年、ドイツの数学者デイヴィッド ヒルベルトとヴィルヘルム アッカーマンは、Entscheidungsproblem (つまり「決定問題」) と呼ばれる問題を提案しました。時間が経つにつれて、彼らが尋ねる質問は、次のような可能性をもたらすでしょう

ソーシャルメディアが情報で溢れる世界では、人々はプラットフォームに投稿するコンテンツや他の人との交流方法にますます注目を集めています。ある投稿にコメントを残した場合、元の投稿者がそのコメントを削除した場合、そのコメントは存続するかどうかが激しく議論されています。 1. 元のコメントは削除されましたが、返信はまだ残っていますか?まず、ソーシャル メディア プラットフォームはユーザー情報とインタラクションの処理方法において非常に柔軟であることを明確にする必要があります。元のコメントが削除されても、直接のつながりがないように見えても、投稿の下に返信が残ることがよくあります。これは、元のコメントが消えたとしても、後続の読者は返信を参照し、それらの返信に基づいて情報を推測できることを意味します。したがって、元のコメントを削除しても、やり取りの痕跡は完全に消去されません。

このプラットフォームでは、興味深い短いビデオを見るだけでなく、興味深いコメントを閲覧することも多くのユーザーにとって楽しい経験となっています。 Tiktokの面白いコメント返信は笑いを誘うだけでなく共感を呼び、時にはコンテンツに華を添えます。 1.Douyinのコメントに対する面白い返信文を書くにはどうすればよいですか? 1. 時事問題のホットスポットを統合する: 時事問題のホットスポットはみんなの注目の的であり、それをコメントや返信に組み込むことで、すぐに他の人の興味を引くことができます。たとえば、Douyin で人気のダンス動画について、「これは私の国で流行中に流行した『ソーシャル シェイク』ですか? とてもエネルギッシュですね!」とコメントできます。このようなコメントはユーモラスで適切であり、人々に理解させることができます。心が微笑みます。誇張の使用は、ユーモアのある解説ではよく使われる手法です。オブジェクトや状況を適度に誇張することで、レビューをより興味深くし、レビューをより面白くすることができます。

Linux オペレーティング システムを使用していて、システムが起動時にドライブを自動的にマウントするようにしたい場合は、デバイスの一意の識別子 (UID) とマウント ポイントのパスを fstab 構成ファイルに追加することでこれを行うことができます。 fstab は、/etc ディレクトリにあるファイル システム テーブル ファイルで、システムの起動時にマウントする必要があるファイル システムに関する情報が含まれています。 fstab ファイルを編集すると、システムを起動するたびに必要なドライブが正しくロードされるようになり、システムの安定した動作が保証されます。ドライバーの自動マウントはさまざまな場面で便利に使えます。たとえば、システムを外部ストレージ デバイスにバックアップする予定です。自動化を実現するには、起動時であってもデバイスがシステムに接続されたままであることを確認してください。同様に、多くのアプリケーションは直接

インターネットの発展に伴い、Web ページに写真は欠かせないものになりました。しかし、画像の数が増えると、画像の読み込み速度が非常に重要な問題になります。この問題を解決するために、多くの Web サイトではサムネイルを使用して画像を表示していますが、サムネイルを生成するには専門的な画像処理ツールを使用する必要があり、専門家以外の人にとっては非常に面倒です。その場合、JavaScript を使用してサムネイルの自動生成を実現するのが良い選択になります。 JavaSの使い方
