PHP实现QQ空间自动回复说说的方法

PHP实现QQ空间自动回复说说的方法

简介

在 PHP 中,可以通过调用第三方库实现登录QQ空间并发布评论、回复的功能。本文将介绍如何使用 PHP 向指定好友的说说进行自动回复。

整体思路

通过 QQ 登录,查找到指定好友的说说,获取说说的ID。通过模拟请求,向该说说增加回复。

具体来讲,可以分为以下步骤:

1.模拟登录 QQ 空间,获取 session、cookie 的值。

2.访问获取好友的说说列表,并获取要回复的说说的 ID。

3.模拟请求,向该说说增加回复。

4.完成自动回复。

详细步骤

1.模拟登录 QQ 空间,获取 session、cookie 的值。

使用 CURL 库来获取登录信息,如代码所示:

$ch = curl_init("https://user.qzone.qq.com/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookie.txt');
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$output = curl_exec($ch);
preg_match_all('/setcookie\("(.*?)",(.*?),"(\S+)",(.*?),"(.*?)",(.*?),(.*?),"(.*?)",(.*?)\)/', $output, $matches);
preg_match('/window.g_qzonetoken\s=\s"(.*?)"/', $output, $token);

其中,g_qzonetoken 即为在后续中必需的 token。

2.访问获取好友的说说列表,并获取要回复的说说的 ID。

访问 url:https://user.qzone.qq.com/proxy/domain/taotao.qq.com/cgi-bin/emotion_cgi_msglist_v6?qzonetoken={$token}&uin={$owner_uin}&ftype=0&sort=0&pos=0&num={$num}&replynum=100&g_tk={$g_tk}。其中,$num 为要获取的说说条数,$owner_uin 为目标说说的所有者 ID,$g_tk 也需要通过之前获取到的 token 来获取。在返回的 JSON 中,可以获取到每一条说说的 ID。

代码示例:

$ch = curl_init("https://user.qzone.qq.com/proxy/domain/taotao.qq.com/cgi-bin/emotion_cgi_msglist_v6?qzonetoken={$token}&uin={$owner_uin}&ftype=0&sort=0&pos=0&num={$num}&replynum=100&g_tk={$g_tk}");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookie.txt');
$output = curl_exec($ch);
$data = json_decode($output, TRUE);
$emm_id = $data['data']['vEmotions'][0]['tid'];

3.模拟请求,向该说说增加回复。

访问 url:https://user.qzone.qq.com/proxy/domain/taotao.qq.com/cgi-bin/emotion_cgi_repcb_all?g_tk={$g_tk}

通过 POST 方法将回复内容以及需要回复的ID作为参数提交。如下代码所示:

$params = array(
    "qzonetoken" => $token,
    "g_tk" => $g_tk,//获取到的g_tk值
    "uin" => $owner_uin,
    "tid" => $emm_id,//回复的说说ID
    "content" => $content,//回复的内容
    "code_version" => 1,
    "format" => "fs",
    "hostUin" => $hostUin,
    "sin" => $sin,
    "sort" => 0,
    "replynum" => 100,
    "categoria" => 0,
    "reid" => $emm_id,
    "source" => 999
);

$ch = curl_init("https://user.qzone.qq.com/proxy/domain/taotao.qq.com/cgi-bin/emotion_cgi_repcb_all?g_tk={$g_tk}");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookie.txt');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Referer: https://user.qzone.qq.com/XXXXXXXX'));
$output = curl_exec($ch);

4.完成自动回复。

在获取到每条好友动态 的 ID 的基础上,逐一向其增加自动回复即可。

示例

以下示例为回复指定好友页面的第一条说说:

$ch = curl_init("https://user.qzone.qq.com/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookie.txt');
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$output = curl_exec($ch);
preg_match_all('/setcookie\("(.*?)",(.*?),"(\S+)",(.*?),"(.*?)",(.*?),(.*?),"(.*?)",(.*?)\)/', $output, $matches);
preg_match('/window.g_qzonetoken\s=\s"(.*?)"/', $output, $token);

$owner_uin = '10001';
$num = 1;
$g_tk = qq_share_callback();
$ch = curl_init("https://user.qzone.qq.com/proxy/domain/taotao.qq.com/cgi-bin/emotion_cgi_msglist_v6?qzonetoken={$token}&uin={$owner_uin}&ftype=0&sort=0&pos=0&num={$num}&replynum=100&g_tk={$g_tk}");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookie.txt');
$output = curl_exec($ch);
$data = json_decode($output, TRUE);
$emm_id = $data['data']['vEmotions'][0]['tid'];

$content = 'hello world';
$hostUin = 123456;
$sin = 0;

$params = array(
    "qzonetoken" => $token,
    "g_tk" => $g_tk,
    "uin" => $owner_uin,
    "tid" => $emm_id,
    "content" => $content,
    "code_version" => 1,
    "format" => "fs",
    "hostUin" => $hostUin,
    "sin" => $sin,
    "sort" => 0,
    "replynum" => 100,
    "categoria" => 0,
    "reid" => $emm_id,
    "source" => 999
);

$ch = curl_init("https://user.qzone.qq.com/proxy/domain/taotao.qq.com/cgi-bin/emotion_cgi_repcb_all?g_tk={$g_tk}");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookie.txt');
curl_exec($ch);
curl_close($ch);

注意事项

1.代码中的 {$token}、{$owner_uin}、{$num}、{$g_tk} 需要根据实际需要替换。

2.在需要登录的网站上扫码登录获取Cookie和Token。

3.实际应用时需注意防止意外造成的违规操作,遵守服务协议。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP实现QQ空间自动回复说说的方法 - Python技术站

(0)
上一篇 2023年6月16日
下一篇 2023年6月16日

相关文章

  • Java中调用Python的实现示例

    Java和Python是两种不同的编程语言,在Java项目中,如果需要使用Python的某些功能,可以通过调用Python脚本来实现。下面是Java中调用Python的实现攻略。 环境准备 使用Java调用Python,需要先安装以下软件: Java开发工具,如Eclipse、IntelliJ IDEA或NetBeans等。 Python解释器,建议使用Py…

    Java 2023年5月26日
    00
  • SpringCloud Feign使用ApacheHttpClient代替默认client方式

    SpringCloud Feign使用ApacheHttpClient代替默认client方式 在SpringCloud中,Feign默认使用URLConnection作为HTTP客户端发送请求。但是,我们可以通过修改配置,使用基于Apache HttpClient的方式发送HTTP请求代替默认的URLConnection。这样可以获得更好的性能和可配置性。…

    Java 2023年6月2日
    00
  • Python学习笔记整理3之输入输出、python eval函数

    Python 学习笔记整理3:输入输出、python eval函数 在本次学习笔记中,我们将会学习和回顾以下内容: Python中的输入输出 Python 中的文件读写 Python中的 eval函数 一、Python中的输入输出 在 Python 中,我们可以使用 print() 函数和 input() 函数来进行标准输入输出。 1. print() 函数…

    Java 2023年5月23日
    00
  • Java Maven高级之插件开发详解

    Java Maven高级之插件开发详解 什么是Maven插件 Maven插件是Maven框架中的一种机制,它通过扩展Maven的功能来满足个性化的需求。本质上,Maven插件就是一个打包好的jar包,它定义了自己的goal,当我们执行Maven命令时,可以通过指定goal来触发插件的执行。 Maven插件的类型 Maven插件可以分为两种:build插件和r…

    Java 2023年5月20日
    00
  • 使用Java对数据库进行基本的查询和更新操作

    使用Java对数据库进行基本的查询和更新操作需要经过以下步骤: 1.建立连接:通过Java提供的JDBC(Java Database Connectivity)API连接数据库,可以使用以下代码示例: String url = "jdbc:mysql://localhost/testdb"; //数据库url String usernam…

    Java 2023年5月19日
    00
  • java程序员如何编写更好的单元测试的7个技巧

    下面是针对”Java程序员如何编写更好的单元测试的7个技巧”的一份攻略。 技巧1:拆分单元测试 单元测试应该足够小,以至于一个单元测试只需要测试一个方法或函数。这样使得测试容易重复、快速执行和简单调试。拆分单元测试也使测试更精确,因为每个单元测试只测试一个输入和输出组合。 示例: 以下是一个简单的 Java 类,将两个整数相加并返回结果: public cl…

    Java 2023年5月20日
    00
  • 简单了解Java关键字throw和throws的区别

    简单了解Java关键字throw和throws的区别 在Java中,throw和throws是两个与异常相关的关键字,它们的作用和使用场景不同,但经常容易混淆。 throw关键字 throw关键字用于抛出一个异常对象。我们可以在代码中手动抛出一个异常对象并且将其名称直接传递给throw语句。抛出异常后,程序会立即终止当前的语句执行,并开始执行异常处理流程。 …

    Java 2023年5月25日
    00
  • 解析MyBatis源码实现自定义持久层框架

    解析MyBatis源码实现自定义持久层框架是一个比较高级的主题,需要我们对MyBatis的原理和实现方式有一定的了解,下面是一个完整攻略: 1. 理解MyBatis的框架结构 MyBatis的框架结构有三个方面: SqlSessionFactoryBuilder:用于创建SqlSessionFactory对象,可以从XML配置文件和Java代码两种方式创建。…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部