无聊想了一下怎样才可以搞一个机器人出来。分析了一下页面,就得出了以下代码。 功能比较弱,耗时无非就是正则的调试。 要做得比较复杂的话,需要做词性分析和词的统计了。当然,这不是本次讨论的重点。 本次已经同步添加了数据库表结构。PS:别拿来做坏事哦
无聊想了一下怎样才可以搞一个机器人出来。分析了一下页面,就得出了以下代码。
功能比较弱,耗时无非就是正则的调试。
要做得比较复杂的话,需要做词性分析和词的统计了。当然,这不是本次讨论的重点。
本次已经同步添加了数据库表结构。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]+?)<\/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('/([\s\S]+?)<\/a>/', $value, $userName);
$replyName = strip_tags($userName['0']);
/**
* 获取需要执行的指令
*/
preg_match("/([\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 */;
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门AI工具
更多
相关专题
更多
Java Spring Boot 微服务实战
本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。
1
2025.12.24
热门下载
更多
网站特效 /
网站源码 /
网站素材 /
前端模板
-
-
-
-
-
-
-
-
-
-
相关下载
更多
精品课程
更多
相关推荐 /
热门推荐 /
最新课程
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号








