youtubeのホワイトハウスの動画を監視するスクリプトが以下のサイトで紹介されていました。作者がこのスクリプトを使ってホワイトハウスの動画を調査したところ、バイデンの動画の低評価がとても多いことと。低評価を減らす操作が行われていることがわかったそうです。
https://phzoe.com/2021/01/27/white-house-youtube-dislike-manipulation/
このスクリプトは英語圏用みたいで、日本語圏の自分の環境では以下のスクリプトで動きました。言語圏によりcurlの応答が変わるのは、curlで「私はこの言語圏にいます」という情報をyoutubeに送っているからなのか、それともyoutubeが勝手にこちらの言語圏を認識してるのかわかりません。詳しい人教えてください。
あとこのプログラムが回りすぎるとDOS攻撃になってしまうと思うので、使うときはターゲットのサイトをホワイトハウス以外に変えてみてください。
# Zoe Phin, 2021/01/26
# Habu, 2021/01/29
require() { sudo apt-get install curl gnuplot; }
stats() {
list=$(curl -s 'https://www.youtube.com/c/WhiteHouse/videos' | grep -o 'watch?v=[^"]*')
for i in $list; do
link="https://www.youtube.com/$i"
#echo -e "\x1B[31m" $link "\x1B[0m"
date=$(date +"%s %x,%R:%S" | tr -d '\n')
curl -s $link | tr -d ',' | tr '}' '\n' > new
grep -m 1 -o '[0-9,]* 回視聴' new > .views
grep -m 1 -o '高評価 [0-9,]* 件' new > .likes
grep -m 1 -o '低評価 [0-9,]* 件' new > .dislikes
paste .views .likes .dislikes | awk -v L=$link -v D="$date" '
NF==8{printf "%s %s %9s %9s %9s\n", L, D, $1, $4, $7}'
done
}
collect() {
while true; do
stats; sleep 75
done | tee -a data.csv
}
dislikes() {
list=$(cut -c1-44 data.csv | sort -u)
for vid in $list; do
echo $vid
grep ^$vid data.csv | awk '{
DiffD=$6-D
if (DiffD < 0) {
printf "%s %+7d\n", $3, DiffD
DLost+=DiffD
}
L=$5; D=$6
} END {
printf "%-19s %7d\n", "Total", DLost
}'
echo
done | awk '{
print} $1=="Total" { GT+=$2 }
END { printf "%-17s %9d\n", "Grant Total", GT
}'
}
plot() {
list=$(cut -c1-44 data.csv | sort -u)
let n=0
for vid in $list; do
let n++
awk -v V=$vid '$1==V {print $2" "$4" "$5" "$6}' data.csv > plot.csv
echo "set term png size 740,740
set key top left
set grid xtics ytics
set title '$vid'
set timefmt '%s'
set xdata time
set xtics format '%Hh'
plot 'plot.csv' u 1:2 t 'Views' w lines lc rgb 'black' lw 2,\
'' u 1:3 t 'Likes' w lines lc rgb 'green' lw 2,\
'' u 1:4 t 'Dislikes' w lines lc rgb 'red' lw 2
" | gnuplot > example${n}.png
done
}
使い方
$source wh.sh;
とします。次に
$collect
とします。このプログラムは75秒間隔で情報をとってきます。
好きなときにCtrl-Dで止めます。
gnuplotが入ってたら
$plot
でグラフがかけます。
中身の解説
まず
list=$(curl -s 'https://www.youtube.com/c/WhiteHouse/videos' | grep -o 'watch?v=[^"]*')
でホワイトハウスのyoutubeチャンネルの動画一覧のリンクを得ます。
次にforループでそのリンクを巡回して
curl -s $link | tr -d ',' | tr '}' '\n' > new
でそのリンクの情報をとってきます。
そして'grep'で狙っている情報を抜き取ります。
grep -m 1 -o '[0-9,]* 回視聴' new > .views
grep -m 1 -o '高評価 [0-9,]* 件' new > .likes
grep -m 1 -o '低評価 [0-9,]* 件' new > .dislikes
あとは表示を整えたり、ポストプロセスの情報処理の部分です。