首頁 php教程 php手册 小鸡汤机器人之动弹自动回复

小鸡汤机器人之动弹自动回复

Jun 06, 2016 pm 07:35 PM
一下 回覆 怎樣 機器 自動

无聊想了一下怎样才可以搞一个机器人出来。分析了一下页面,就得出了以下代码。 功能比较弱,耗时无非就是正则的调试。 要做得比较复杂的话,需要做词性分析和词的统计了。当然,这不是本次讨论的重点。 本次已经同步添加了数据库表结构。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 */;
登入後複製
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱門文章

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1248
24
使用ddrescue在Linux上恢復數據 使用ddrescue在Linux上恢復數據 Mar 20, 2024 pm 01:37 PM

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

如何在iOS 17上的iMessage中向右滑動并快速回复 如何在iOS 17上的iMessage中向右滑動并快速回复 Sep 20, 2023 am 10:45 AM

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

無法引導到Windows復原環境 無法引導到Windows復原環境 Feb 19, 2024 pm 11:12 PM

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

「從未被製造出來的最重要機器」,艾倫·圖靈及圖靈機那些事 「從未被製造出來的最重要機器」,艾倫·圖靈及圖靈機那些事 Jun 25, 2023 pm 07:42 PM

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

原評論刪除回覆還在嗎?給別人留言刪掉之後別人還能看到嗎? 原評論刪除回覆還在嗎?給別人留言刪掉之後別人還能看到嗎? Mar 23, 2024 pm 05:56 PM

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

Linux小技巧:取消vim貼上時的自動縮排 Linux小技巧:取消vim貼上時的自動縮排 Mar 07, 2024 am 08:30 AM

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

使用JavaScript實現自動縮圖生成 使用JavaScript實現自動縮圖生成 Jun 16, 2023 pm 12:51 PM

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

在Linux上自動裝載驅動器 在Linux上自動裝載驅動器 Mar 20, 2024 am 11:30 AM

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

See all articles