
Twitterで自動投稿する雛形-#脱TwitterAPI。
2023.02.05
おはようございます、この記事はQiitaに投稿したもののと同じ内容になります。
エンジニアに悲報としか言えない今回の発表・イーロン・マスク氏って👹
2月9日でTwitterAPIが無料で使えなくなるのでその対応をしないといけない。
そんなエンジニアさんもいらっしゃると思います。
APIサービスに月、1万円払えないという会社は中小企業には多いと思います、それで取引を解消される企業とかもあったりするかも。
そんな方は一個VPSサーバーを構えてNodeJSをインストールして下記の雛形コードを元にゴニョゴニョしたら何とかなるかも知れません。🫠
因みにこれはchatGPTとの合作だったりします。
- いつまで動作するかは保証しません。尚、これは雛形ですので、これに細工をして常時接続で
- TweetやRTするようにコードを変更しないといけません。もしくは時間を置いてTweetするなど。
node sample.js 'username' 'password' 'テスト投稿'
const puppeteer = require('puppeteer');
const [username, password ,tw] = process.argv.slice(2);
(async () => {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://twitter.com/login');
await page.waitForTimeout(3000);
await page.waitForSelector('input[autocomplete="username"]');
await page.type('input[autocomplete="username"]', username);
const divs = await page.$$('div[role="button"]');
await divs[2].click();
await page.waitForTimeout(3000);
await page.waitForSelector('input[autocomplete="current-password"]');
await page.type('input[autocomplete="current-password"]', password);
await page.waitForSelector('div[data-testid="LoginForm_Login_Button"]');
await page.click('div[data-testid="LoginForm_Login_Button"]');
await page.waitForNavigation();
console.log('Login successful');
await page.waitForTimeout(3000);
await page.waitForSelector('div[data-testid="tweetTextarea_0"]');
await page.click('div[data-testid="tweetTextarea_0"]');
await page.waitForSelector('div[data-testid="tweetTextarea_0"]');
await page.type('div[data-testid="tweetTextarea_0"]',tw);
await page.waitForTimeout(3000);
await page.waitForSelector('div[data-testid="tweetButtonInline"]');
await page.click('div[data-testid="tweetButtonInline"]');
console.log('Tweet posted');
await browser.close();
})();
タグ
async, autocomplete, await browser.close, await browser.newPage, await page.goto, await page.waitForSelector, await page.waitForTimeout, ChatGPT, const, data-testid, div, headless, input, nodejs, password, qiita, require, tw, TwitterAPI, username,

Anglesharpというライブラリの話。
2021.03.13
久しぶりに技術的なお話の記事を書きます。AnglesharpというのはC#などでスクレイピングするときにスクレイピングを補助してくれるライブラリで結構人気のあるライブラリなるようです。スクレイピングするコードは下記のようになります。この書き方が至ってシンプルで書きやすいのではないかなと思っています。
var Url = $"https://zip358.com/";
var querySelector = $"#index_post_list > li.clearfix.num1.type1 > div > h3";
var document = BrowsingContext.New(Configuration.Default.WithDefaultLoader()).OpenAsync(Url).Result;
var element = document.QuerySelector(querySelector);
Console.WriteLine($"blogtitle is {element.InnerHtml}");
このライブラリはとても良いのですが、一つ問題があります。スクレイピングするのですが・・・これjavascriptがOFFの状態でスクレイピングされるのですね。どうもこのコードではJSがONにはならないようですね。因みに自分はそのことを知っていなかったのでどハマリしました。大手の検索サイトなどはjavascriptがOFFの状態でも閲覧できるようになっている事を知りました、試しにブラウザをOFFの状態にしてみるとソースコードがかなり違っていてJSのONの状態とは情報が差異がある事が理解できると思います。
Anglesharpのコンフィグ設定(init)でエージェントなどを設定してあげると上手くJSがONの状態をスクレイピングすることが可能なのかもしれません。動画を見る限りではまだかもしれません・・・。
タグ
1, 3, 358, anglesharp, BrowsingContext, clearfix, com, Configuration, default, div, document, element, gt, https, index, li, LIST, new, num, OpenAsync, POST, QueryS, querySelector, quot, result, type, url, var, WithDefaultLoader, zip, お話, コード, シンプル, スク, とき, ピング, ライブラリ, レイ, 下記, 久しぶり, 人気, 書き方, 補助, 記事, 話,

Yahooが567(コロナ)の情報を取り扱っているそれも県単位でURLまとめたよ。
2020.12.20
Yahooが567の情報を取り扱っている。567(コロナ)を県単位で情報を配信しているまとめリンクサイトを作りましたので、ご自由にお使いください。
リンクはこちらです。https://zip358.com/tool/demo28/
ソースコードとJSONを貼っときます。IT土方さんみたいな事をした?。
<script>
fetch("./assets/js/ken47.json").then(response => response.json()).then((data)=>{
let ken = [];
ken.push('<div class="list-group">');
for (const key in data) {
ken.push("<a class='list-group-item list-group-item-action' href='https://hazard.yahoo.co.jp/article/covid19" + data[key].roman + "' target='_"+ data[key].roman +"'>" + data[key].name +":::https://hazard.yahoo.co.jp/article/covid19" + data[key].roman + "</a>");
}
ken.push("</div>");
document.getElementById("covid19-link-list").innerHTML = ken.join("")
});
</script>
{
"1": {
"name": "北海道",
"roman": "hokkaido"
},
"2": {
"name": "青森",
"roman": "aomori"
},
"3": {
"name": "岩手",
"roman": "iwate"
},
"4": {
"name": "宮城",
"roman": "miyagi"
},
"5": {
"name": "秋田",
"roman": "akita"
},
"6": {
"name": "山形",
"roman": "yamagata"
},
"7": {
"name": "福島",
"roman": "fukushima"
},
"8": {
"name": "茨城",
"roman": "ibaraki"
},
"9": {
"name": "栃木",
"roman": "tochigi"
},
"10": {
"name": "群馬",
"roman": "gunma"
},
"11": {
"name": "埼玉",
"roman": "saitama"
},
"12": {
"name": "千葉",
"roman": "chiba"
},
"13": {
"name": "東京",
"roman": "tokyo"
},
"14": {
"name": "神奈川",
"roman": "kanagawa"
},
"15": {
"name": "新潟",
"roman": "niigata"
},
"16": {
"name": "富山",
"roman": "toyama"
},
"17": {
"name": "石川",
"roman": "ishikawa"
},
"18": {
"name": "福井",
"roman": "fukui"
},
"19": {
"name": "山梨",
"roman": "yamanashi"
},
"20": {
"name": "長野",
"roman": "nagano"
},
"21": {
"name": "岐阜",
"roman": "gifu"
},
"22": {
"name": "静岡",
"roman": "shizuoka"
},
"23": {
"name": "愛知",
"roman": "aichi"
},
"24": {
"name": "三重",
"roman": "mie"
},
"25": {
"name": "滋賀",
"roman": "shiga"
},
"26": {
"name": "京都",
"roman": "kyoto"
},
"27": {
"name": "大阪",
"roman": "osaka"
},
"28": {
"name": "兵庫",
"roman": "hyogo"
},
"29": {
"name": "奈良",
"roman": "nara"
},
"30": {
"name": "和歌山",
"roman": "wakayama"
},
"31": {
"name": "鳥取",
"roman": "tottori"
},
"32": {
"name": "島根",
"roman": "shimane"
},
"33": {
"name": "岡山",
"roman": "okayama"
},
"34": {
"name": "広島",
"roman": "hiroshima"
},
"35": {
"name": "山口",
"roman": "yamaguchi"
},
"36": {
"name": "徳島",
"roman": "tokushima"
},
"37": {
"name": "香川",
"roman": "kagawa"
},
"38": {
"name": "愛媛",
"roman": "ehime"
},
"39": {
"name": "高知",
"roman": "kochi"
},
"40": {
"name": "福岡",
"roman": "fukuoka"
},
"41": {
"name": "佐賀",
"roman": "saga"
},
"42": {
"name": "長崎",
"roman": "nagasaki"
},
"43": {
"name": "熊本",
"roman": "kumamoto"
},
"44": {
"name": "大分",
"roman": "oita"
},
"45": {
"name": "宮崎",
"roman": "miyazaki"
},
"46": {
"name": "鹿児島",
"roman": "kagoshima"
},
"47": {
"name": "沖縄",
"roman": "okinawa"
}
}
タグ
39, 47, 567, assets, class, const, data, div, fetch, For, gt, in, IT, JS, json, ken, key, let, list-grou, list-group, list-group-item, lt, push, quot, response, script, then, url, Yahoo, コード, こちら, コロナ, サイト, ソース, それ, まとめ, リンク, 事, 単位, 土方, 情報, 県, 配信,
ajaxはクロスドメインを許していないのでこうするしかない?わけではないけれど(提供会社による)
2019.05.11
ライブドアが提供している天気予報APIをJSだけで
なんとか出来ないかと思ったので試してみたけれど無理でしたので、
一回、PHPで読み込んでその情報を取得するという事で解決。
昔はYahooがそういう事を提供してたみたいですが
提供終了してました。
<div style="display: table;">
<div style="display: table-cell;">
今日の天気::<br>
<img id="weather_0" src="">
</div>
<div style="display: table-cell;">
明日の天気<br>
<img id="weather_1" src="">
</div>
</div>
<script>
$(function(){
$.ajax({
type: 'GET',
//'http://weather.livedoor.com/forecast/webservice/json/v1?city=390010',
url: 'https://zip358.com/weather/',
data:null,
dataType: 'json'
}).done(function(data){
$("#weather_0").attr("src",data.forecasts["0"].image.url);
$("#weather_1").attr("src",data.forecasts["1"].image.url);
});
});
</script>
タグ
'src', 0, ajax, API, br, display, div, gt, ID, img, JS, lt, php, style, TABLE, table-cell, weather, Yahoo, クロス, ドメイン, ライブドア, わけ, 一, 予報, 事, 今日, 取得, 天気, 情報, 提供, 明日, 昔, 終了, 解決,