小鸡汤机器人之动弹自动回复
无聊想了一下怎样才可以搞一个机器人出来。分析了一下页面,就得出了以下代码。 功能比较弱,耗时无非就是正则的调试。 要做得比较复杂的话,需要做词性分析和词的统计了。当然,这不是本次讨论的重点。 本次已经同步添加了数据库表结构。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 Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

DDREASE是一種用於從檔案或區塊裝置(如硬碟、SSD、RAM磁碟、CD、DVD和USB儲存裝置)復原資料的工具。它將資料從一個區塊設備複製到另一個區塊設備,留下損壞的資料區塊,只移動好的資料區塊。 ddreasue是一種強大的恢復工具,完全自動化,因為它在恢復操作期間不需要任何干擾。此外,由於有了ddasue地圖文件,它可以隨時停止和恢復。 DDREASE的其他主要功能如下:它不會覆寫恢復的數據,但會在迭代恢復的情況下填補空白。但是,如果指示工具明確執行此操作,則可以將其截斷。將資料從多個檔案或區塊還原到單

如何在iPhone上使用滑動在iMessages中回覆注意:滑動回應功能僅適用於iOS17中的iMessage對話,不適用於「訊息」應用程式中的常規SMS對話。在iPhone上開啟「訊息」應用程式。然後,前往iMessage對話,只需在您要回覆的iMessage上向右滑動即可。完成此操作後,所選的iMessage將成為焦點,而所有其他訊息將在背景中模糊不清。您將看到一個文字框,用於鍵入回復以及“+”圖標,用於訪問iMessage應用程序,如“簽到”、“位置”、“貼紙”、“照片”等。只需輸入您的訊息,

Windows復原環境(WinRE)是用來修復Windows作業系統錯誤的環境。進入WinRE後,您可以執行系統還原、出廠重設、卸載更新等操作。如果無法引導到WinRE,本文將指導您使用修復程式解決此問題。無法引導至Windows復原環境如果無法引導至Windows復原環境,請使用下方提供的修復程式:檢查Windows復原環境的狀態使用其他方法進入Windows復原環境您是否意外刪除了Windows復原分割區?執行Windows的就地升級或全新安裝下面,我們已經詳細解釋了所有這些修復。 1]檢查Wi

計算是我們大多數人憑直覺就能理解的熟悉概念。我們以函數f(x)=x+3為例,當x為3時,f(3)=3+3。答案是6,非常簡單。很明顯,這個函數是可計算的。但是有些函數並非那麼簡單,而且要確定它們是否可以計算也非易事,這意味著它們可能永遠無法得出一個最終答案。 1928年,德國數學家大衛・希爾伯特(DavidHilbert)和威廉・阿克曼(WilhelmAckermann)提出了一個名為Entscheidungsproblem(即「判定性問題」)的問題。隨著時間推移,他們提出的這個問題將引出可

在社群媒體訊息氾濫的今天,人們越來越關注他們在平台上發布的內容以及與他人的互動。當我們在某個帖子下發表評論後,如果原作者將其刪除,這條評論是否會繼續存在,成為一個備受爭議的問題。一、原評論刪除回覆還在嗎?首先,需要明確的是,社群媒體平台在處理用戶資訊和互動方面具有很高的靈活性。儘管原始評論被刪除,但回應通常仍然保留在帖子下方,即使它們可能看起來沒有直接聯繫,但仍然存在。這意味著即使原始評論已經消失,後來的讀者仍然可以看到回复,並根據這些回复推測出一些信息。因此,刪除原評論並不能完全消除互動的痕

前言vim是個強大的文字編輯的工具,在Linux端得到極大的使用熱度。最近在另外一台伺服器上使用vim時,遇到了一個奇怪的問題:當我將本地編寫好的腳本複製並貼上到伺服器中的空白檔案時,出現了自動縮排的情況。用個簡單的例子來說,就是我在本地寫的腳本如下:aaabbbcccddd當我將上述內容複製後,粘貼到伺服器中的空白文件後得到的卻是:aabbbcccddd很明顯,這是vim給我們自動進行了格式縮排。但是,這個自動有點不聰明。這裡記錄下解決方案。解決方案:設定.vimrc設定檔我們在家目錄下,新

隨著網路的發展,圖片已成為網頁中不可或缺的一部分。但是隨著圖片數量的增多,圖片的載入速度成為了一個很重要的問題。為了解決這個問題,許多網站都採用了縮圖的方式來展示圖片,但是為了產生縮圖,我們需要使用專業的圖片處理工具,對於一些非專業人士來說,這是一個很麻煩的事情。那麼,使用JavaScript實現自動縮圖產生就成為了一個不錯的選擇。如何使用JavaS

如果您使用Linux作業系統,並希望系統在啟動時自動載入驅動器,可以透過將裝置的唯一識別碼(UID)和掛載點路徑新增至fstab設定檔來實現。 fstab是位於/etc目錄中的檔案系統表文件,它包含了系統在啟動時需要掛載的檔案系統的資訊。透過編輯fstab文件,您可以確保在每次系統啟動時都能正確載入所需的驅動器,從而確保系統的穩定運作。自動安裝驅動器可方便地應用於多種情境。例如,我計劃將系統備份到外部儲存設備。為了實現自動化,需確保設備與系統保持連接,甚至在啟動時。同樣,很多應用程式會直接
