一、前提概要
分类
从终端来说,分为手机微信机器人、电脑微信机器人;
从操作系统来说,分为PC微信机器人,MAC OS微信机器人,安卓微信机器人,IOS微信机器人;
从实现原理来说,分为协议机器人,HOOK代码机器人(侵入式);
从广泛程度来说,PC微信机器人应用和安卓微信机器人,应用最为广泛。
市面主要流行的几种机器人原理:
0.破解pc协议
1.破解ipad协议
2.hook微信客户端
3.hook pc客户端协议
其中大多数是第一种或者第三种。
今天我们主要用第三种。
二、环境准备
因为需要PC端的微信客户端稳定在线,所以首先需要一台稳定的24小时挂机的windows系统电脑。这几年阿里云一直推云无影云端电脑实现远程办公。我们可以借助这个免费一个月的电脑搭建试下,反正白嫖的,哈哈哈哈~
windows系统配置 无影云桌面2核4G内存130G硬盘
白嫖一个月免费体验:www.aliyun.com/activity...
无影云桌面2核4G内存130G硬盘拼团优惠购买链接(拼团价119/年):www.aliyun.com/activity...
系统非常干净,自带一个常用软件的应用下载软件,都是办公、开发必备的软件,流畅无卡顿。
初次购买无法上外网,云无影桌面控制台,开通访问互联网
然后根据阿里云发的使用说明邮件操作,就可以畅快的玩耍。本地windows下载无影云电脑客户端登录。
这里阿里云也是免费送一个月的10M带宽的网络。
下图是下载速度:
系统配置
然后下载可爱猫,下载地址:weitemi.lanzoub.com/iC1Yu01i6v9…
三、安装可爱猫
下载可爱猫后,再去浏览器里面搜7z,下载安装压缩软件解压。当被windows提示安全警告是,执行允许即可。
可爱猫运行界面,这里的插件我使用的是iHttp,第一次可以右键升级到最新版。
双击这模块,即可看到微信与外部通讯的http接口。
主要的接口定义:
<?php
/**
* @name Api接口
*/
/**
接口列表
发送文本消息 send_text_msg()
发送群消息并艾特某人 send_group_at_msg()
发送图片消息 send_image_msg()
发送视频消息 send_video_msg()
发送文件消息 send_file_msg()
发送动态表情 send_emoji_msg()
发送分享链接 send_link_msg()
发送音乐消息 send_music_msg()
取指定登录账号的昵称 get_robot_name()
取指定登录账号的头像 get_robot_headimgurl() 限测版
取登录账号列表 get_logged_account_list()
取好友列表 get_friend_list()
取群聊列表 get_group_list()
取群成员资料 get_group_member() 限测版
取群成员列表 get_group_member_list()
接收好友转账 accept_transfer()
同意群聊邀请 agree_group_invite() 限测版
同意好友请求 agree_friend_verify()
修改好友备注 modify_friend_note()
删除好友 delete_friend() 限测版
踢出群成员 remove_group_member()
修改群名称 modify_group_name()
修改群公告 modify_group_notice()
建立新群 building_group() 限测版
退出群聊 quit_group() 限测版
邀请加入群聊 invite_in_group()
*/
define("API_KEY","www.juejin.com");
define("API_URL","http://127.0.0.1:6060/post?key=".API_KEY);
/**
* 发送文字消息(好友或者群)
* @access public
* @param string $robwxid 登录账号id,用哪个账号去发送这条消息
* @param string $to_wxid 对方的id,可以是群或者好友id
* @param string $msg 消息内容
* @return string json_string
*/
function send_text_msg($robwxid, $to_wxid, $msg){
$data = array();
$data['type'] = 100; // Api数值(可以参考 - api列表demo)
$data['msg'] = rawurlencode($msg); // 发送内容
$data['to_wxid'] = $to_wxid; // 对方id
$data['robot_wxid'] = $robwxid; // 账户id,用哪个账号去发送这条消息
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 名片消息
* @access public
* @param string $robwxid 登录账号id,用哪个账号去发送这条消息
* @param string $to_wxid 对方的id,可以是群或者好友id
* @param string $msg 名片格式数据
* @return string json_string
*/
function mingpianxiaoxi_msg($robwxid, $to_wxid, $card_data){
$data = array();
$data['type'] = 42; // Api数值(可以参考 - api列表demo)
$data['to_wxid'] = $to_wxid; // 对方id (支持好友/群ID)
$data['robot_wxid'] = $robwxid; // 账户id,用哪个账号去发送这条消息
$data['card_data'] = $card_data; // 名片格式数据
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 发送群消息并艾特某人
* @param string $robwxid 账户id,用哪个账号去发送这条消息
* @param string $from_wxid 群id
* @param string $final_from_wxid 艾特的id,群成员的id ,发送消息用户的ID
* @param string $final_from_name 艾特的昵称,群成员的昵称,发送消息用户名
* @param string $msg 消息内容
*/
function send_group_at_msg($robwxid, $from_wxid, $final_from_wxid, $final_from_name, $msg){
$data = array();
$data['type'] = 102; // Api数值(可以参考 - api列表demo)
$data['msg'] = rawurlencode($msg); // 消息内容
$data['group_wxid'] = $from_wxid; // 群id
$data['member_wxid'] = $final_from_wxid; // 艾特的id,群成员的id
$data['member_name'] = $final_from_name; // 艾特的昵称,群成员的昵称
$data['robot_wxid'] = $robwxid; // 账户id,用哪个账号去发送这条消息
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 发送图片消息
* @access public
* @param string $robwxid 登录账号id,用哪个账号去发送这条消息
* @param string $to_wxid 对方的id,可以是群或者好友id
* @param string $path 图片的绝对路径 如下:
1、发送网络图片,需要编码如rawurlencode('https://www.qiquanji.com/zb_users/theme/ccvok_zsy/image/logo1.png')
2、发送本地图片,需要编码如rawurlencode('E:\Program Files\图片\1.png')
*/
function send_image_msg($robwxid, $to_wxid, $path){
$data = array();
$data['type'] = 103; // Api数值(可以参考 - api列表demo)
$data['msg'] = rawurlencode($path); // 发送的图片的绝对路径
$data['to_wxid'] = $to_wxid; // 对方id
$data['robot_wxid'] = $robwxid; // 账户id,用哪个账号去发送这条消息
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 发送视频消息
* @access public
* @param string $robwxid 账户id,用哪个账号去发送这条消息
* @param string $to_wxid 对方的id,可以是群或者好友id
* @param string $path 视频的绝对路径 (参考图片)
* @return string json_string
*/
function send_video_msg($robwxid, $to_wxid, $path){
$data = array();
$data['type'] = 104; // Api数值(可以参考 - api列表demo)
$data['msg'] = rawurlencode($path); // 发送的视频的绝对路径
$data['to_wxid'] = $to_wxid; // 对方id
$data['robot_wxid'] = $robwxid; // 账户id,用哪个账号去发送这条消息
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 发送文件消息
* @access public
* @param string $robwxid 账户id,用哪个账号去发送这条消息
* @param string $to_wxid 对方的id,可以是群或者好友id
* @param string $path 文件的绝对路径 (参考图片)
* @return string json_string
*/
function send_file_msg($robwxid, $to_wxid, $path){
$data = array();
$data['type'] = 105; // Api数值(可以参考 - api列表demo)
$data['msg'] = rawurlencode($path); // 发送的文件的绝对路径
$data['to_wxid'] = $to_wxid; // 对方id(默认发送至来源的id,也可以发给其他人)
$data['robot_wxid'] = $robwxid; // 账户id,用哪个账号去发送这条消息
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 发送动态表情
* @access public
* @param string $robwxid 账户id,用哪个账号去发送这条消息
* @param string $to_wxid 对方的id,可以是群或者好友id
* @param string $path 动态表情文件(通常是gif)的绝对路径 (发送图片消息一样)
*/
function send_emoji_msg($robwxid, $to_wxid, $path){
$data = array();
$data['type'] = 106; // Api数值(可以参考 - api列表demo)
$data['msg'] = rawurlencode($path); // 发送的动态表情的绝对路径
$data['to_wxid'] = $to_wxid; // 对方id(默认发送至来源的id,也可以发给其他人)
$data['robot_wxid'] = $robwxid; // 账户id,用哪个账号去发送这条消息
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 发送分享链接
* @access public
* @param string $robwxid 账户id,用哪个账号去发送这条消息
* @param string $to_wxid 对方的id,可以是群或者好友id
* @param string $title 链接标题
* @param string $text 链接内容
* @param string $target_url 跳转链接 允许空参数
* @param string $pic_url 图片链接 允许空参数
* @param string $icon_url; 图标的链接 允收空参数
* @return string json_string
*/
function send_link_msg($robwxid, $to_wxid, $title, $text, $target_url, $pic_url,$icon_url){
// 封装链接结构体
$data = array();
$data['type'] = 107;
$data['title'] = $title;
$data['text'] = $text;
$data['target_url'] = $target_url;
$data['pic_url'] = $pic_url;
$data['icon_url'] = $icon_url; // 图标的链接
$data['to_wxid'] = $to_wxid; // 对方id(默认发送至来源的id,也可以发给其他人)
$data['robot_wxid'] = $robwxid; // 账户id,用哪个账号去发送这条消息
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 发送音乐分享
* @access public
* @param string $robwxid 账户id,用哪个账号去发送这条消息
* @param string $to_wxid 对方的id,可以是群或者好友id
* @param string $name 歌曲名字
* @return string json_string
*/
function send_music_msg($robwxid, $to_wxid, $name){
$data = array();
$data['type'] = 108; // Api数值(可以参考 - api列表demo)
$data['msg'] = $name; // 歌曲名字
$data['to_wxid'] = $to_wxid; // 对方id(默认发送至来源的id,也可以发给其他人)
$data['robot_wxid'] = $robwxid; // 账户id,用哪个账号去发送这条消息
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 取指定登录账号的昵称
* @access public
* @param string $robwxid 账户id
* @return string 账号昵称
*/
function get_robot_name($robwxid){
$data = array();
$data['type'] = 201; // Api数值(可以参考 - api列表demo)
$data['robot_wxid'] = $robwxid; // 账户id
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 取指定登录账号的头像 (限测版 失败)
* @access public
* @param string $robwxid 账户id
* @return string 头像http地址
*/
function get_robot_headimgurl($robwxid){
$data = array();
$data['type'] = 202; // Api数值(可以参考 - api列表demo)
$data['robot_wxid'] = $robwxid; // 账户id
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 取登录账号列表
* @access public
* @param string $robwxid 账户id
* @return string 当前框架已登录的账号信息列表
可以获取到名称,图片,微信号等
*/
function get_logged_account_list(){
$data = array();
$data['type'] = 203; // Api数值(可以参考 - api列表demo)
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 取好友列表(只能获取到数量)
* @access public
* @param string $robwxid 账户id
* @param string $is_refresh 是否刷新
* @return string 当前框架已登录的账号信息列表
*/
function get_friend_list($robwxid='', $is_refresh=0){
$data = array();
$data['type'] = 204; // Api数值(可以参考 - api列表demo)
$data['robot_wxid'] = $robwxid; // 账户id(可选,如果填空字符串,即取所有登录账号的好友列表,反正取指定账号的列表)
$data['is_refresh'] = $is_refresh; // 是否刷新列表,0 从缓存获取 / 1 刷新并获取
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 取群聊列表 (只能获取到群数量)
* @access public
* @param string $robwxid 账户id
* @param string $is_refresh 是否刷新
* @return string 当前框架已登录的账号信息列表
*/
function get_group_list($robwxid='', $is_refresh=0){
$data = array();
$data['type'] = 205; // Api数值(可以参考 - api列表demo)
$data['robot_wxid'] = $robwxid; // 账户id(可选,如果填空字符串,即取所有登录账号的好友列表,反正取指定账号的列表)
$data['is_refresh'] = $is_refresh; // 是否刷新列表,0 从缓存获取 / 1 刷新并获取
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 取群成员列表,获取群有多少个人(只能获取到群数量)
* @access public
* @param string $robwxid 账户id
* @param string $group_wxid 群id
* @param string $is_refresh 是否刷新
* @return string 当前框架已登录的账号信息列表
*/
function get_group_member_list($robwxid, $group_wxid, $is_refresh=0){
$data = array();
$data['type'] = 206; // Api数值(可以参考 - api列表demo)
$data['robot_wxid'] = $robwxid; // 账户id
$data['group_wxid'] = $group_wxid; // 群id
$data['is_refresh'] = $is_refresh; // 是否刷新列表,0 从缓存获取 / 1 刷新并获取
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 取群成员资料(限测版 失败)
* @access public
* @param string $robwxid 账户id
* @param string $group_wxid 群id
* @param string $member_wxid 群成员id
* @return string json_string
*/
function get_group_member($robwxid, $group_wxid, $member_wxid){
$data = array();
$data['type'] = 207; // Api数值(可以参考 - api列表demo)
$data['robot_wxid'] = $robwxid; // 账户id,取哪个账号的资料
$data['group_wxid'] = $group_wxid; // 群id
$data['member_wxid'] = $member_wxid; // 群成员id
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 接收好友转账 (未测试)
* @access public
* @param string $robwxid 账户id
* @param string $friend_wxid 朋友id
* @param string $json_string 转账事件原消息
* @return string json_string
*/
function accept_transfer($robwxid, $friend_wxid, $json_string){
$data = array();
$data['type'] = 301; // Api数值(可以参考 - api列表demo)
$data['robot_wxid'] = $robwxid; // 账户id
$data['friend_wxid'] = $friend_wxid; // 朋友id
$data['msg'] = $json_string; // 转账事件原消息
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 同意群聊邀请 (未测试 限测版)
* @access public
* @param string $robwxid 账户id
* @param string $json_string 同步消息事件中群聊邀请原消息
* @return string json_string
*/
function agree_group_invite($robwxid, $json_string){
$data = array();
$data['type'] = 302; // Api数值(可以参考 - api列表demo)
$data['robot_wxid'] = $robwxid; // 账户id
$data['msg'] = $json_string; // 同步消息事件中群聊邀请原消息
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 同意好友请求 (未测试)
* @access public
* @param string $robwxid 账户id
* @param string $json_string 好友请求事件中原消息
* @return string json_string
*/
function agree_friend_verify($robwxid, $json_string){
$data = array();
$data['type'] = 303; // Api数值(可以参考 - api列表demo)
$data['robot_wxid'] = $robwxid; // 账户id
$data['msg'] = $json_string; // 好友请求事件中原消息
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 修改好友备注
* @access public
* @param string $robwxid 账户id
* @param string $friend_wxid 好友id
* @param string $note 新备注(空字符串则是删除备注)
* @return string json_string
*/
function modify_friend_note($robwxid, $friend_wxid, $note){
$data = array();
$data['type'] = 304; // Api数值(可以参考 - api列表demo)
$data['robot_wxid'] = $robwxid; // 账户id
$data['friend_wxid'] = $friend_wxid; // 朋友id
$data['msg'] = $note; // 新备注(空字符串则是删除备注)
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 删除好友 (未测试 限测版)
* @access public
* @param string $robwxid 账户id
* @param string $friend_wxid 好友id
* @return string json_string
*/
function delete_friend($robwxid, $friend_wxid){
$data = array();
$data['type'] = 305; // Api数值(可以参考 - api列表demo)
$data['robot_wxid'] = $robwxid; // 账户id
$data['friend_wxid'] = $friend_wxid; // 朋友id
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 踢出群成员 (未测试)
* @access public
* @param string $robwxid 账户id
* @param string $group_wxid 群id
* @param string $member_wxid 群成员id
* @return string json_string
*/
function remove_group_member($robwxid, $group_wxid, $member_wxid){
$data = array();
$data['type'] = 306; // Api数值(可以参考 - api列表demo)
$data['robot_wxid'] = $robwxid; // 账户id
$data['group_wxid'] = $friend_wxid; // 群id
$data['member_wxid'] = $member_wxid; // 群成员id
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 修改群名称
* @access public
* @param string $robwxid 账户id
* @param string $group_wxid 群id
* @param string $group_name 新群名
* @return string json_string
*/
function modify_group_name($robwxid, $group_wxid, $group_name){
$data = array();
$data['type'] = 307; // Api数值(可以参考 - api列表demo)
$data['robot_wxid'] = $robwxid; // 账户id
$data['group_wxid'] = $group_wxid; // 群id
$data['group_name'] = $group_name; // 新群名
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 修改群公告
* @access public
* @param string $robwxid 账户id
* @param string $group_wxid 群id
* @param string $notice 新公告
* @return string json_string
*/
function modify_group_notice($robwxid, $group_wxid, $content){
$data = array();
$data['type'] = 308; // Api数值(可以参考 - api列表demo)
$data['robot_wxid'] = $robwxid; // 账户id
$data['group_wxid'] = $group_wxid; // 群id
$data['content'] = $content; // 新公告
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 建立新群 (未测试 限测版)
* @access public
* @param string $robwxid 账户id
* @param array $friends 三个人及以上的好友id数组,['wxid_1xxx', 'wxid_2xxx', 'wxid_3xxx', 'wxid_4xxx']
* @return string json_string
*/
function building_group($robwxid, $friends){
$data = array();
$data['type'] = 309; // Api数值(可以参考 - api列表demo)
$data['robot_wxid'] = $robwxid; // 账户id
$data['friends'] = $friends; // 好友id数组
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 退出群聊 (限测版 失败)
* @access public
* @param string $robwxid 账户id
* @param string $group_wxid 群id
* @return string json_string
*/
function quit_group($robwxid, $group_wxid){
$data = array();
$data['type'] = 310; // Api数值(可以参考 - api列表demo)
$data['robot_wxid'] = $robwxid; // 账户id
$data['group_wxid'] = $group_wxid; // 群id
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 邀请加入群聊
* @access public
* @param string $robwxid 账户id
* @param string $group_wxid 群id
* @param string $friend_wxid 要邀请的好友ID
* @return string json_string
*/
function invite_in_group($robwxid, $group_wxid, $friend_wxid){
$data = array();
$data['type'] = 311; // Api数值(可以参考 - api列表demo)
$data['robot_wxid'] = $robwxid; // 账户id
$data['group_wxid'] = $group_wxid; // 群id
$data['friend_wxid'] = $friend_wxid; // 要邀请的好友ID
$response = array('data' => json_encode($data));
$url = API_URL;
return sendSGHttp($url, $response,'post');
}
/**
* 执行一个 HTTP 请求,仅仅是post组件,其他语言请自行替换即可
* @param string $url 执行请求的url地址
* @param mixed $params 表单参数
* @param int $timeout 超时时间
* @param string $method 请求方法 post / get
* @return array 结果数组
*/
function sendSGHttp($url, $params, $method = 'get', $timeout = 3)
{
if (null == $url) return null;
$curl = curl_init();
if ('get' == $method) {//以GET方式发送请求
curl_setopt($curl, CURLOPT_URL, $url);
} else {//以POST方式发送请求
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, 1);//post提交方式
curl_setopt($curl, CURLOPT_POSTFIELDS, $params);//设置传送的参数
}
curl_setopt($curl, CURLOPT_HEADER, false);//设置header
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);//要求结果为字符串且输出到屏幕上
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $timeout);//设置等待时间
$res = curl_exec($curl);//运行curl
$err = curl_error($curl);
if (false === $res || !empty($err)) {
$Errno = curl_errno($curl);
$Info = curl_getinfo($curl);
curl_close($curl);
//print_r($Info);
return $err. ' result: ' . $res . 'error_msg: '.$Errno;
}
curl_close($curl);//关闭curl
return $res;
}
?>
除了云无影云桌面外,在阿里云做活动的时候自己买云服务器装windows系统使用,后面还可以重装无桌面的Linux系统。
有什么以为可以联系我QQ:1533640732 或者下面评论,给我留言。