まず最初に、微信の閉じられたエコシステムについて少し愚痴を言いたいと思います。搜狗という検索エンジンに微信公式アカウントの API を開放している以外は、ほとんど利用できる API がありません。これは確かにセキュリティの観点からの考慮があるのですが、それによっていくつかの面白い機能が実現できなくなりました。例えば、ロボットです。また、いくつかの便利な機能は、公式のクライアントに実装されていません。
要件#
Chrome の Web 版微信をベースに、Chrome の標準のコンソールと JavaScript を使用して、自動的にメッセージを送信する。
実装#
まず、事前に JavaScript という言語については全く知りませんでした。すべては検索エンジンを駆使して一歩一歩実現されたものですので、この記事を見ている方々に何か問題がある場合は、コメントで指摘していただければ幸いです。
ウェブページのソースコード
まず、もちろんウェブ版微信にログインし、ついでに F12 開発者ツールを開いて、いくつかのメッセージを送信し、ネットワークタブでウェブページのアクティビティを観察しました。そして、次のようなコードを見つけました。
<pre id="editArea" contenteditable-directive="" mm-paste="" class="flex edit_area ng-isolate-scope ng-pristine ng-valid" contenteditable="true" ng-blur="editAreaBlur($event)" ng-model="editAreaCtn" ng-click="editAreaClick($event)" ng-keyup="editAreaKeyup($event)" ng-keydown="editAreaKeydown($event)"></pre>
しかし、これは何の役にも立ちませんでした...
Google 検索
その後、微信、メッセージの送信、Chrome、コンソール、JavaScript というキーワードで検索を行い、最終的にこの記事 ->用 javascriptt 脚本实现微信定时发送信息を見つけました。キーワードに一致しました。さっそく開いてみると、まさに私が求めていたものでした。
コードの変更
// 月曜日から金曜日:午前6:50に起きるように促す、午後9:30に寮に戻るように促す
var appElement = document.querySelector('[ng-controller=chatSenderController]');
var $scope = angular.element(appElement).scope();
setInterval(function(){
var localTime = new Date();
if(localTime.getDay() < 6){ //週末でない場合
var localTimeString = localTime.toLocaleTimeString();
if(localTimeString.indexOf('上午6:49:00') === 0){
$scope.editAreaCtn = "もう6時50分です、起きてください!";
$scope.sendTextMessage();
}else if(localTimeString.indexOf('上午6:54:00') === 0){
$scope.editAreaCtn = "今日も一日頑張ってください!";
$scope.sendTextMessage();
}else if(localTimeString.indexOf('下午9:28:00') === 0){
$scope.editAreaCtn = "もうすぐ9時30分です、戻ってください!";
$scope.sendTextMessage();
}
}
},1000);
この記事では、メッセージを送信する前にいくつかの判断を行う必要がありますが、私は必要ありません。ただ送信すればいいだけです。(そうです、インターバル時間を設定する必要もあります。そうしないとスパムになってしまいます)。最終的には次のように変更しました。
var appElement = document.querySelector('[ng-controller=chatSenderController]');
var $scope = angular.element(appElement).scope();
setInterval(function(){
$scope.editAreaCtn = "メッセージ内容";
$scope.sendTextMessage();
},1000);
そして、この小さなコードをコンソールに入力して実行しましたが、あら、速すぎました。急いで停止しましたが、Chrome はメッセージを送信するために全力を注いでいました...。仕方なく Chrome のプロセスを終了しました。
sleep の追加と最終結果
その後、Python には sleep という使い方があることを思い出し、すぐに検索しましたが、JavaScript には sleep というものはありません。
最後にコードを変更し、for ループと組み合わせて無限ループを作成しました。最終的な結果は次のようになります。
var appElement = document.querySelector('[ng-controller=chatSenderController]');
var $scope = angular.element(appElement).scope();
async function test() {
$scope.editAreaCtn = "メッセージ内容";
$scope.sendTextMessage();
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms))
}
i = 0
for (; ; i++) {
test()
await sleep(1000000)
}
それでは、ウェブ版微信にログインし、メッセージを送信したいチャットウィンドウを特定し、実行するだけです!
続き
前の記事を書いた後、問題が発生しました。ある人が私のコードに暗号化が組み込まれていると笑っていましたので、彼の要求に応じて修正し、さらに 10〜15 分の間隔でランダムにインターバル時間を選択する機能を追加しました。コードは以下のようになります。
var appElement = document.querySelector('[ng-controller=chatSenderController]');
var $scope = angular.element(appElement).scope();
var n = 10;
var m = 15;
//sleepをインポート
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms))
}
//メッセージを送信
async function test() {
$scope.editAreaCtn = "メッセージ内容";
$scope.sendTextMessage();
}
//n〜mのランダムな数を生成
function rd(n,m){
var c = m-n+1;
return Math.floor(Math.random() * c + n);
}
//無限ループ
while(true){
test();
t = rd(n,m)
console.log(t)
await sleep(t * 10000);
}
本日の水文は以上です。