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

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

Jun 06, 2016 pm 07:35 PM
une fois répondre comment 机器 自动

无聊想了一下怎样才可以搞一个机器人出来。分析了一下页面,就得出了以下代码。 功能比较弱,耗时无非就是正则的调试。 要做得比较复杂的话,需要做词性分析和词的统计了。当然,这不是本次讨论的重点。 本次已经同步添加了数据库表结构。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();
Copier après la connexion
-- 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 */;
Copier après la connexion
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Impossible de démarrer dans l'environnement de récupération Windows Impossible de démarrer dans l'environnement de récupération Windows Feb 19, 2024 pm 11:12 PM

L'environnement de récupération Windows (WinRE) est un environnement utilisé pour réparer les erreurs du système d'exploitation Windows. Après avoir entré WinRE, vous pouvez effectuer une restauration du système, une réinitialisation d'usine, désinstaller les mises à jour, etc. Si vous ne parvenez pas à démarrer WinRE, cet article vous guidera à travers les correctifs pour résoudre le problème. Impossible de démarrer dans l'environnement de récupération Windows Si vous ne pouvez pas démarrer dans l'environnement de récupération Windows, utilisez les correctifs fournis ci-dessous : Vérifiez l'état de l'environnement de récupération Windows Utilisez d'autres méthodes pour accéder à l'environnement de récupération Windows Avez-vous accidentellement supprimé la partition de récupération Windows ? Effectuez une mise à niveau sur place ou une nouvelle installation de Windows ci-dessous, nous avons expliqué tous ces correctifs en détail. 1] Vérifiez le Wi-Fi

Utilisez ddrescue pour récupérer des données sous Linux Utilisez ddrescue pour récupérer des données sous Linux Mar 20, 2024 pm 01:37 PM

DDREASE est un outil permettant de récupérer des données à partir de périphériques de fichiers ou de blocs tels que des disques durs, des SSD, des disques RAM, des CD, des DVD et des périphériques de stockage USB. Il copie les données d'un périphérique bloc à un autre, laissant derrière lui les blocs corrompus et ne déplaçant que les bons blocs. ddreasue est un puissant outil de récupération entièrement automatisé car il ne nécessite aucune interruption pendant les opérations de récupération. De plus, grâce au fichier map ddasue, il peut être arrêté et repris à tout moment. Les autres fonctionnalités clés de DDREASE sont les suivantes : Il n'écrase pas les données récupérées mais comble les lacunes en cas de récupération itérative. Cependant, il peut être tronqué si l'outil est invité à le faire explicitement. Récupérer les données de plusieurs fichiers ou blocs en un seul

Comment balayer vers la droite et répondre rapidement dans iMessage sur iOS 17 Comment balayer vers la droite et répondre rapidement dans iMessage sur iOS 17 Sep 20, 2023 am 10:45 AM

Comment utiliser Swipe to Répondre dans iMessages sur iPhone Remarque : la fonctionnalité Swipe to Répondre ne fonctionne qu'avec les conversations iMessage dans iOS 17, pas avec les conversations SMS classiques dans l'application Messages. Ouvrez l'application Messages sur votre iPhone. Ensuite, dirigez-vous vers la conversation iMessage et faites simplement glisser votre doigt vers la droite sur l'iMessage auquel vous souhaitez répondre. Une fois cela fait, l'iMessage sélectionné sera mis au point tandis que tous les autres messages seront flous en arrière-plan. Vous verrez une zone de texte pour saisir une réponse et une icône "+" pour accéder aux applications iMessage telles que les enregistrements, les lieux, les autocollants, les photos, etc. Entrez simplement votre message,

'La machine la plus importante jamais construite', Alan Turing et la Machine de Turing 'La machine la plus importante jamais construite', Alan Turing et la Machine de Turing Jun 25, 2023 pm 07:42 PM

L'informatique est un concept familier que la plupart d'entre nous comprennent intuitivement. Prenons la fonction f(x)=x+3 comme exemple. Lorsque x vaut 3, f(3)=3+3. La réponse est 6, très simple. Évidemment, cette fonction est calculable. Mais certaines fonctions ne sont pas si simples, et déterminer si elles peuvent être calculées n’est pas trivial, ce qui signifie qu’elles ne mèneront peut-être jamais à une réponse définitive. En 1928, les mathématiciens allemands David Hilbert et Wilhelm Ackermann proposèrent un problème appelé Entscheidungsproblem (c'est-à-dire « problème de décision »). Au fil du temps, la question qu'ils posent mènera à d'éventuelles

Comment écrire une phrase de réponse intéressante à un commentaire TikTok ? Quels sont les avantages de répondre aux commentaires ? Comment écrire une phrase de réponse intéressante à un commentaire TikTok ? Quels sont les avantages de répondre aux commentaires ? Mar 21, 2024 pm 06:01 PM

Sur cette plateforme, en plus de regarder de courtes vidéos intéressantes, parcourir des commentaires intéressants est également devenu une expérience agréable pour de nombreux utilisateurs. Les réponses amusantes aux commentaires de Tiktok suscitent non seulement le rire, mais résonnent également et ajoutent parfois de l'éclat au contenu. 1. Comment écrire une phrase de réponse intéressante à un commentaire de Douyin ? 1. Intégrer les points chauds de l'actualité : Les points chauds de l'actualité sont au centre de l'attention de tous. Les intégrer dans les commentaires et les réponses peut rapidement susciter l'intérêt des autres. Par exemple, sur une vidéo de danse populaire sur Douyin, vous pouvez commenter : « Est-ce le « social shake » qui est devenu populaire pendant l'épidémie dans mon pays ? C'est tellement énergique ! De tels commentaires sont humoristiques et appropriés, et peuvent faire comprendre aux gens ! Mon cœur sourit. Le recours à l'exagération est une technique courante dans les commentaires humoristiques. En exagérant modérément un objet ou une situation, vous pouvez rendre la critique plus intéressante et rendre le

Le commentaire original a été supprimé. La réponse est-elle toujours là ? Les autres peuvent-ils toujours voir mes commentaires après que je les ai supprimés ? Le commentaire original a été supprimé. La réponse est-elle toujours là ? Les autres peuvent-ils toujours voir mes commentaires après que je les ai supprimés ? Mar 23, 2024 pm 05:56 PM

Dans un monde où les réseaux sociaux regorgent d’informations, les gens accordent de plus en plus d’attention au contenu qu’ils publient sur la plateforme et à la manière dont ils interagissent avec les autres. Lorsque nous laissons un commentaire sous un certain message, si l'auteur original le supprime, la question de savoir si le commentaire continuera d'exister est devenue une question très controversée. 1. Le commentaire original a été supprimé. La réponse est-elle toujours là ? Premièrement, il doit être clair que les plateformes de médias sociaux sont très flexibles dans la manière dont elles traitent les informations et les interactions des utilisateurs. Même si le commentaire original est supprimé, les réponses restent souvent sous la publication, même si elles ne semblent pas directement liées. Cela signifie que même si le commentaire original a disparu, les lecteurs suivants peuvent toujours voir les réponses et déduire certaines informations basées sur ces réponses. Par conséquent, la suppression du commentaire original n’éliminera pas complètement les traces de l’interaction.

Monter automatiquement les disques sous Linux Monter automatiquement les disques sous Linux Mar 20, 2024 am 11:30 AM

Si vous utilisez un système d'exploitation Linux et souhaitez que le système monte automatiquement un lecteur au démarrage, vous pouvez le faire en ajoutant l'identifiant unique (UID) du périphérique et le chemin du point de montage au fichier de configuration fstab. fstab est un fichier de table du système de fichiers situé dans le répertoire /etc. Il contient des informations sur les systèmes de fichiers qui doivent être montés au démarrage du système. En modifiant le fichier fstab, vous pouvez vous assurer que les lecteurs requis sont chargés correctement à chaque démarrage du système, garantissant ainsi un fonctionnement stable du système. Les pilotes à montage automatique peuvent être utilisés facilement dans diverses situations. Par exemple, je prévois de sauvegarder mon système sur un périphérique de stockage externe. Afin de réaliser l'automatisation, assurez-vous que l'appareil reste connecté au système, même au démarrage. De même, de nombreuses applications seront directement

Génération automatique de vignettes à l'aide de JavaScript Génération automatique de vignettes à l'aide de JavaScript Jun 16, 2023 pm 12:51 PM

Avec le développement d’Internet, les images sont devenues un élément indispensable des pages Web. Mais à mesure que le nombre d’images augmente, la vitesse de chargement des images est devenue un problème très important. Afin de résoudre ce problème, de nombreux sites Web utilisent des vignettes pour afficher des images, mais pour générer des vignettes, nous devons utiliser des outils de traitement d'images professionnels, ce qui est une chose très gênante pour certains non-professionnels. Ensuite, utiliser JavaScript pour générer automatiquement des vignettes devient un bon choix. Comment utiliser JavaS

See all articles