无聊想了一下怎样才可以搞一个机器人出来。分析了一下页面,就得出了以下代码。
功能比较弱,耗时无非就是正则的调试。
要做得比较复杂的话,需要做词性分析和词的统计了。当然,这不是本次讨论的重点。
本次已经同步添加了数据库表结构。ps:别拿来做坏事哦。
项目的git地址:http://git.oschina.net/fallbirds/oscsend-chicken-soup
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('/([\s\s]+?)/', $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('/([\s\s]+?)/', $value, $username); $replyname = strip_tags($username['0']); /** * 获取需要执行的指令 */ preg_match(/([\s\s]+?)/, $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.9set 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 */;