本身刷抖音時訓練的模型不行呀,推薦給個人都是一些沙雕視頻,都是摳腳大漢,不多漂亮的小姐姐,可是本身刷抖音訓練的話又太耗時間了,剛看看了 ADB ,發現這個簡直就是寶庫,想着就要不就使用 ADB 來幫我訓練一下,省的我手動訓練了。html
關於 ADB,能夠看我以前的文章,ADB 實用筆記git
首先使用 Node.js 封裝下 ADB 的命令,爲了兼容鏈接多臺設備的問題,能夠使用一個標誌位,同時每次使用的時候使用 use
方法來指定對應的設備,call
方法做爲全部調用命令的基礎方法:github
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 查詢設備的基本操做。那麼問題就是怎麼識別抖音的視頻裏有好看的小姐姐呢?shell
我想的就是經過人臉識別的 API 來判斷,能夠經過 ADB
來截圖,而後調用相應的 AI 接口判斷截圖中人的顏值和性別,而後再決定是否關注和點贊該視頻,而後上滑切換到下一個視頻,如此反覆。api
整理一下,須要封裝的 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…:app
在註冊完成後能夠在控制檯的應用管理看到對應的試用的 API key 和 API Secretdom
和大多數開放平臺同樣,是經過將這兩個值傳遞給後臺來鑑權的,而且試用類型是免費的。async
在控制檯的人臉識別欄目下的 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…
最後照舊是一個廣告貼,最近新開了一個分享技術的公衆號,歡迎你們關注👇(目前關注人數可憐🤕)