自己刷抖音時訓練的模型不行呀,推薦給我的都是一些沙雕視訊,都是摳腳大漢,很少漂亮的小姐姐,但是自己刷抖音訓練的話又太耗時間了,剛看看了 ADB ,發現這個簡直就是寶庫,想著就要不就使用 ADB 來幫我訓練一下,省的我手動訓練了。
關於 ADB,可以看我之前的文章,ADB 實用筆記
首先使用 Node.js 封裝下 ADB 的命令,為了相容連線多臺裝置的問題,可以使用一個標誌位,同時每次使用的時候使用 use
方法來指定對應的裝置,call
方法作為所有呼叫命令的基礎方法:
const { exec } = require('child_process')
const path = require('path')
let currentDeviceName = ''
let isVerbose = false
const call = (code) => {
return new Promise((resolve, reject) => {
const command = `adb ${currentDeviceName ? `-s ${currentDeviceName}` : ''} ${code}`
if (isVerbose) console.log(command, '\n')
exec(command, (err, stdout, stderr) => {
if (err) reject(new Error(err + ''))
resolve(stdout)
})
})
}
const use = (device) => currentDeviceName = device.name
const verbose = (value) => isVerbose = value
複製程式碼
新增對應的裝置查詢方法,並通過解析字串的形式來將裝置儲存為陣列:
const rawDevices = () => call('devices')
const devices = async () => {
return (await rawDevices())
.split(/\n/)
.map(line => line.split('\t'))
.filter(line => line.length > 1)
.map(device => ({ name: device[0].trim(), status: device[1].trim() }))
}
複製程式碼
現在完成了 ADB 查詢裝置的基本操作。那麼問題就是怎麼識別抖音的視訊裡有好看的小姐姐呢?
我想的就是通過人臉識別的 API 來判斷,可以通過 ADB
來截圖,然後呼叫相應的 AI 介面判斷截圖中人的顏值和性別,然後再決定是否關注和點贊該視訊,然後上滑切換到下一個視訊,如此反覆。
整理一下,需要封裝的 ADB 命令就是點選命令、滑動和截圖命令:
const touch = (x, y) => call(`shell input tap ${x} ${y}`)
const swipe = (x1, y1, x2, y2, ms = 200) => call(`shell input swipe ${x1} ${y1} ${x2} ${y2} ${ms} `)
const screenshot = (filename = 's.png', localSavePath = './') => call(`shell screencap -p > ${path.resolve(localSavePath, filename)}`)
複製程式碼
接著就是看看市場上的 AI 介面了,我選擇的是 Face++ 的介面,www.faceplusplus.com.cn/face-detect…:
在註冊完成後可以在控制檯的應用管理看到對應的試用的 API key 和 API Secret
和大多數開放平臺一樣,是通過將這兩個值傳遞給後臺來鑑權的,並且試用型別是免費的。
在控制檯的人臉識別欄目下的 Detect API 下可以看到對應的請求介面引數要求和相應的返回,console.faceplusplus.com.cn/documents/4…
在可選引數 return_attributes
裡的 gender
和 beauty
就是判斷性別和顏值的。
介面返回值格式如下:
其中 faces
是一個陣列,其實也很容易理解,畢竟一張圖片裡可能不止一個人嗎,每張臉的的顏值 beauty
是一個物件,區分了在男女眼中的顏值。真相了,男生和女生的審美不一樣!
基於上面的分析可以開始寫程式碼了,通過 https
模組呼叫介面即可,為了方便將圖片通過 base64 的形式傳遞,大致如下:
const https = require('https');
const querystring = require('querystring');
const { base64Sync } = require('base64-img')
module.exports = function (file, scoreLevel = 70) {
const base64 = base64Sync(file)
const data = querystring.stringify({
api_key: "自己的api_key",
api_secret: "自己的api_secret",
image_base64: base64,
return_attributes: 'gender,age,beauty'
})
const options = {
host: 'api-cn.faceplusplus.com',
path: '/facepp/v3/detect',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
}
return new Promise((resolve, reject) => {
const req = https.request(options, (res) => {
res.on('data', (d) => {
let b = {}
try {
b = JSON.parse('' + d)
} catch (err) {
resolve({
shouldFollow: false
})
return
}
const faces = b.faces || []
let shouldFollow = false
let score = 0
for (let i = 0; i < faces.length; i++) {
const attrs = faces[i].attributes
score = attrs.beauty.male_score
if (attrs.gender.value == 'Female' && attrs.beauty.male_score >= scoreLevel) {
shouldFollow = true
break
}
}
resolve({
shouldFollow,
score
})
})
});
req.on('error', (e) => {
resolve(false)
});
req.write(data)
req.end()
})
}
複製程式碼
這裡對外接受檔案和顏值分數要求,如果返回的 faces
陣列中有大於這個分數要求並且性別是小姐姐的話就關注和點贊。
為了更好地訓練效果,可以在點贊和關注的視訊裡多停留一會兒,這樣抖音就更加知道我們喜歡看小姐姐了。
接著就是處理對應的點贊和關注的 tap 操作,這個我是通過我自己手機螢幕的解析度和按鈕位置大致估算出來的(更精確的可以截一張抖音的圖然後通過 faststone 之類的工具量出位置):
我試的是點贊 1300 是可以的,關注 1200 是可以的,我的手機解析度是 1080 X 2280
。
上滑操作其實很好處理,x軸不變,y軸變小即可。
以上分析完後,先實現個等待函式。
function awaitMoment(time = 2000) {
return new Promise((resolve) => {
setTimeout(() => resolve(), time)
})
}
複製程式碼
裝置開啟抖音後,先上滑切換一個視訊
async function main() {
const device = (await adb.devices())[0]
adb.use(device)
adb.verbose(true)
await adb.swipe(200, 1000, 200, 100, 200)
await awaitMoment()
}
複製程式碼
等待兩秒後截一個圖,(這裡做的很粗糙,因為兩秒的截圖可能沒有小姐姐,但是實踐證明,這樣訓練是可以的),然後呼叫 face++ 的介面,根據結果來是否關注和點贊,然後刪掉對應的截圖,接著呼叫這個方法:
const fileName = ((Math.random() + '').substr(2, 7)) + '.png'
await adb.screenshot(fileName, path.resolve(__dirname, 'images'))
const file = path.resolve(path.resolve(__dirname, 'images', fileName))
const { shouldFollow, score } = await face(file, 70)
console.log('shouldFollow', shouldFollow)
console.log('score', score)
if (shouldFollow) {
await adb.touch(1000, 1300)
await adb.touch(1000, 1200)
await awaitMoment(5000)
}
fs.unlinkSync(file)
await main()
複製程式碼
這樣基本就大功告成了。
執行即可啦,接著就是等待程式自動幫助我們關注好看的小姐姐了。
我大概訓練了2,3個小時,效果還是很明顯的,抖音從給我推薦各種沙雕視訊變成了各種小姐姐,抖音推薦演算法牛逼呀,哈哈哈哈,這樣上班划水的時候也歡樂。
因為 gif 圖太大,太麻煩了,所以就簡單拍了個視訊,可以看看程式訓練的過程,愛奇藝連結 www.iqiyi.com/w_19saaayji…、油管連結 www.youtube.com/watch?v=-_G…
最後看下我的賬號經過訓練的效果:
(其實也有一個問題,就是濾鏡太嚴重了,很多網紅臉,不知道有沒有識別網紅臉的演算法)
以上所有的程式碼都開源在了我的 github 上,地址是 github.com/huruji/find…
最後照舊是一個廣告貼,最近新開了一個分享技術的公眾號,歡迎大家關注?(目前關注人數可憐?)