私は試してみて、インターネットプロバイダからお金を得るボットを構築


私のISPとの契約では、彼らは私に予想する速度の範囲を与えました、また、保証された最小であった速度も与えました.もし彼らがこの最低を維持することができないならば、私は1年につき数回割引を受ける資格があります.
私はspeedtest spamming座っていない.私の速度が低くなっているとき、チェックするネット.私は、ディップがあったかどうか知りたかったです.ディップは同じ時でしたか?パターンがありましたか?私はデータを必要とするいくつかのデータの可視化を知っているとき/私は任意の割引の対象となる可能性がありますし、それが追求する価値があるかどうか.

このようなもの


私の信頼できるラズベリーパイの上で走ること.ルータからUSBケーブルを通して動かされて、結果(他のネットワーク使用を禁止する)が信頼できるべきであるように、イーサネットによって接続しました.
私の現在の帯域幅結果liveまたはGitHubでソースコードを読んでください.

オーバーデザイン
私はあまりにも複雑にこのプロジェクトを始めた.私はNetflixの高速を訪問するために、セレンと呼ばれるWebブラウザ自動化フレームワークを使用しました.私の速度をチェックするCOM帯域幅テスト.それはヘッドレスクロムのインスタンスを使用しました.
# wait for test to finish i.e. when 'your speed message' is shown
WebDriverWait(driver, 120).until(
    expected_conditions.presence_of_element_located(
        (By.CSS_SELECTOR, FAST_COMPLETE_CSS))
)
これは非常に脆弱で、CSSの変更に対して脆弱であった(これはハードコーディングされなければならなかった).また、このプロジェクトのどんなユーザーもRaspbian(デフォルトのLinuxのRaspberry PiのためのDireco)のためのヘッドレスのクロムセットアップを得るために必要だったことを意味した.トラブルシューティングして、それを実行した後に、私はそれが設計されたとわかりました.
このメソッドを使用すると、プロジェクト(browsertest.py)のオプションが残っていますが、ブラウザのオーバヘッドにより、raspberry pis上でより正確な結果が得られません.注意:このプロジェクトはプラットフォーム上で動作しますが、PISに向けて主に割り当てられています.
私はSpeedTestのゲームで発見した.NETは大きなCLIライブラリを持っています.私がダウンロード速度をclitest.pyで得る方法は、ここにあります.
import speedtest

# ..

def get_speed():
    """
    Use Speedtest CLI to test bandwidth speed.
        :return: Download speed in Mbps
    """
    s = speedtest.Speedtest()
    s.download()
    results_dict = s.results.dict()
    return results_dict['download'] / 1048576  # convert bits to megabits
このスクリプトはcrontab経由で実行され、サーバを指します.python clitest.py 'https://server-location/save' 'password'に類似したコマンドは、30分ごとに走ります.Windowsの代替はタスクスケジューラですが、私はそれがclunkierと信じています.

バックエンド
私は、私がどこかから私の速度をチェックすることができるためにきちんとしていると思いました.これは2つのAPIルートを持つExpress/Nodeプロジェクトです.
結果は、パスワードを伴う/saveに送られます.そして、それはグリッチの上で環境変数によってセットされます.
結果のスライスはJSONで/readから読むことができます.ここでは、そのための急行ルートのように見えます.
// get bandwidth test results for graphing here
app.get("/read", function(request, response) {
  const data = db.get("results").value();
  const prepared = data.map(s => {
    return { x: s.date, y: Number(s.speed).toFixed(3) };
  });
  const trimmed = prepared.slice(Math.max(prepared.length - 48, 1));
  response.send(trimmed); // send a slice of results
});
ストレージのために、私は全くセットアップを全く必要としなかった何かを望みました.lowdbは小さなローカルのJSONデータベースです、そして、1つのプロセスが読んでいるか、書くことになるだけであるので、それは完璧です、そして、書き込みイベントは1時間半ほどごとに起こります.lowdbは'データベース'ファイルを作成します.
Glitch project
データ可視化
チャート.JSはJavaScriptのグラフのライブラリに移動し、キャンバスAPIを使用します.それはバッテリーが含まれて、デフォルトで素晴らしく見えます(多分、私はちょうどスタイルに慣れています)!APIコールを含めた50行程度です.
fetch('/read')
    .then(response => response.json())
    .then(json => renderGraph(json));
const safeDate = time => new Date(parseInt(time)).toUTCString();
const renderGraph = (speedData) => {
    var ctx = document.getElementById('myChart').getContext('2d');
    var myChart = new Chart(ctx, {
    type: 'scatter',
    data: {
        datasets: [{
            data: speedData,
            backgroundColor: () => 'rgba(255, 99, 132, 0.2)',
            borderColor: () => 'rgba(255, 99, 132, 1)',
            borderWidth: 1,
            pointRadius: 5,
        }]
    },
    options: {
        scales: {
            xAxes: [{
                type: 'linear',
                position: 'bottom',
                ticks: {
                    userCallback: (label, index, labels) => safeDate(label)
                },
                scaleLabel: {
                    display: true,
                    labelString: 'Date'
                }
            }],
            yAxes: [{
                scaleLabel: {
                    display: true,
                    labelString: 'Mbps'
                },
                ticks: {
                    beginAtZero: true
                }
            }],
        },
        title: {
            display: true,
            text: 'Bandwidth Test Results'
        },
        legend: {
            display: false,
        },
        tooltips: {
            callbacks: {
                label: function(tooltipItem, data) {
                return `${tooltipItem.value} Mbps @ ${safeDate(tooltipItem.label)}`;
                }
            }
        }
    }
    });
}
私は簡単にチャートで遊ぶのがわかります.JSとJavaScriptのようにあなたは何かを一緒にスローする場合は非常に生産的です.ドキュメントは素晴らしいです、そして、それは一般的な検索が役に立つスタックオーバーの答えを見つける大きな十分な図書館です.

ここからどこへ行くか
これまで、私の速度は保証された最小値のまわりでホバリングしていました.現在、私は文句を言う理由がありません!楽しい驚き.
私が現在私の速度の最新の記録を持って、それはどんな将来の帯域幅問題でも診断するのが簡単です.うまくいけば、このプロジェクトのコードのいくつかは、一日を通してあなたの帯域幅を持つ任意の簡単な問題を診断するのに役立ちます.
参加150 +人々私の プログラミングと個人的な成長にサインアップ!
私は技術についてつぶやきます.