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 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Windows 복구 환경으로 부팅할 수 없습니다 Windows 복구 환경으로 부팅할 수 없습니다 Feb 19, 2024 pm 11:12 PM

WinRE(Windows 복구 환경)는 Windows 운영 체제 오류를 복구하는 데 사용되는 환경입니다. WinRE에 들어간 후 시스템 복원, 공장 초기화, 업데이트 제거 등을 수행할 수 있습니다. WinRE로 부팅할 수 없는 경우 이 문서에서는 문제 해결을 위한 수정 사항을 안내합니다. Windows 복구 환경으로 부팅할 수 없습니다. Windows 복구 환경으로 부팅할 수 없는 경우 아래 제공된 수정 사항을 사용하십시오. Windows 복구 환경 상태 확인 다른 방법을 사용하여 Windows 복구 환경으로 들어가십시오. 실수로 Windows 복구 파티션을 삭제하셨습니까? 아래에서 전체 업그레이드 또는 Windows 새로 설치를 수행하십시오. 이러한 모든 수정 사항에 대해 자세히 설명했습니다. 1] Wi-Fi 확인

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의 iMessage에서 밀어서 답장하는 방법 참고: 밀어서 답장 기능은 메시지 앱의 일반 SMS 대화가 아닌 iOS 17의 iMessage 대화에서만 작동합니다. iPhone에서 메시지 앱을 엽니다. 그런 다음 iMessage 대화로 이동하여 답장하려는 iMessage를 오른쪽으로 스와이프하면 됩니다. 이 작업이 완료되면 선택한 iMessage에 초점이 맞춰지고 다른 모든 메시지는 배경에서 흐려집니다. 답장을 입력하기 위한 텍스트 상자와 체크인, 장소, 스티커, 사진 등과 같은 iMessage 앱에 접근하기 위한 "+" 아이콘이 표시됩니다. 메시지를 입력하시면 됩니다.

'지금까지 만들어지지 않은 가장 중요한 기계', 앨런 튜링과 튜링 기계 '지금까지 만들어지지 않은 가장 중요한 기계', 앨런 튜링과 튜링 기계 Jun 25, 2023 pm 07:42 PM

컴퓨팅은 우리 대부분이 직관적으로 이해하는 친숙한 개념입니다. 함수 f(x)=x+3을 예로 들어 보겠습니다. x가 3일 때 f(3)=3+3입니다. 대답은 6입니다. 매우 간단합니다. 분명히 이 함수는 계산 가능합니다. 그러나 일부 기능은 그렇게 간단하지 않으며 계산 가능 여부를 결정하는 것이 쉽지 않습니다. 즉, 최종 답변으로 이어지지 않을 수도 있습니다. 1928년 독일 수학자 David Hilbert와 Wilhelm Ackermann은 Entscheidungsproblem(즉, "결정 문제")이라는 문제를 제안했습니다. 시간이 지남에 따라 그들이 묻는 질문은 가능한 것으로 이어질 것입니다.

원래 댓글이 삭제됐는데 답글이 아직 남아있나요? 내가 댓글을 삭제한 후에도 다른 사람들이 내 댓글을 계속 볼 수 있나요? 원래 댓글이 삭제됐는데 답글이 아직 남아있나요? 내가 댓글을 삭제한 후에도 다른 사람들이 내 댓글을 계속 볼 수 있나요? Mar 23, 2024 pm 05:56 PM

소셜 미디어가 정보로 넘쳐나는 세상에서 사람들은 자신이 플랫폼에 게시하는 콘텐츠와 다른 사람들과 상호 작용하는 방식에 점점 더 많은 관심을 기울이고 있습니다. 특정 게시물에 댓글을 남겼을 때, 작성자가 이를 삭제하면 해당 댓글이 계속 존재할 수 있는지가 뜨거운 논란이 되고 있습니다. 1. 원래 댓글이 삭제됐는데 댓글이 아직도 남아있나요? 첫째, 소셜 미디어 플랫폼이 사용자 정보와 상호 작용을 처리하는 방식에 있어 매우 유연하다는 점을 분명히 해야 합니다. 원래 댓글이 삭제되더라도 직접 연결되지 않은 것처럼 보이더라도 답변이 게시물 아래에 남아 있는 경우가 많습니다. 즉, 원래 댓글이 사라졌더라도 후속 독자는 여전히 답변을 보고 해당 답변을 기반으로 일부 정보를 추론할 수 있습니다. 따라서 원본 댓글을 삭제해도 상호작용의 흔적이 완전히 사라지지는 않습니다.

TikTok 댓글에 흥미로운 답장 문장을 작성하는 방법은 무엇입니까? 댓글에 답하면 어떤 이점이 있나요? TikTok 댓글에 흥미로운 답장 문장을 작성하는 방법은 무엇입니까? 댓글에 답하면 어떤 이점이 있나요? Mar 21, 2024 pm 06:01 PM

이 플랫폼에서는 흥미로운 짧은 동영상을 보는 것 외에도 흥미로운 댓글을 탐색하는 것도 많은 사용자에게 즐거운 경험이 되었습니다. 재미있는 틱톡 댓글은 웃음을 유발할 뿐만 아니라 공감을 불러일으키고 때로는 콘텐츠에 반짝임을 더해주는 답글입니다. 1. Douyin 댓글에 흥미로운 답변 문장을 작성하는 방법은 무엇입니까? 1. 시사 핫스팟 통합: 시사 핫스팟은 모두의 관심의 초점입니다. 이를 댓글과 답글에 통합하면 다른 사람들의 관심을 빠르게 불러일으킬 수 있습니다. 예를 들어, Douyin의 인기 댄스 동영상에서 다음과 같이 댓글을 달 수 있습니다. "이게 우리나라에서 유행했던 '사회적 동요'인가요? 정말 활력이 넘칩니다. 이런 댓글은 유머러스하고 적절하며 사람들이 이해할 수 있습니다." 내 마음은 웃는다. 과장을 사용하는 것은 유머러스한 논평에서 흔히 사용되는 기법입니다. 사물이나 상황을 적당히 과장함으로써 리뷰를 더욱 흥미롭게 만들고

Linux에서 드라이브 자동 마운트 Linux에서 드라이브 자동 마운트 Mar 20, 2024 am 11:30 AM

Linux 운영 체제를 사용하고 시스템이 부팅 시 드라이브를 자동으로 마운트하도록 하려면 장치의 고유 식별자(UID)와 마운트 지점 경로를 fstab 구성 파일에 추가하면 됩니다. fstab은 /etc 디렉터리에 있는 파일 시스템 테이블 파일입니다. 여기에는 시스템 시작 시 마운트해야 하는 파일 시스템에 대한 정보가 포함되어 있습니다. fstab 파일을 편집하면 시스템이 시작될 때마다 필요한 드라이브가 올바르게 로드되어 안정적인 시스템 작동을 보장할 수 있습니다. 드라이버 자동 장착을 통해 다양한 상황에서 편리하게 사용할 수 있습니다. 예를 들어, 내 시스템을 외부 저장 장치에 백업할 계획입니다. 자동화를 달성하려면 시작 시에도 장치가 시스템에 연결된 상태를 유지해야 합니다. 마찬가지로, 많은 애플리케이션이 직접적으로

JavaScript를 사용한 자동 썸네일 생성 JavaScript를 사용한 자동 썸네일 생성 Jun 16, 2023 pm 12:51 PM

인터넷이 발달하면서 사진은 웹페이지에서 없어서는 안 될 부분이 되었습니다. 하지만 이미지 수가 증가함에 따라 이미지 로딩 속도가 매우 중요한 문제가 되었습니다. 이 문제를 해결하기 위해 많은 웹사이트에서는 썸네일을 사용하여 이미지를 표시하지만, 썸네일을 생성하려면 전문적인 이미지 처리 도구를 사용해야 하는데, 이는 일부 비전문가에게는 매우 번거로운 일입니다. 그런 다음 JavaScript를 사용하여 자동 썸네일 생성을 달성하는 것이 좋은 선택이 됩니다. 자바 사용 방법

See all articles