webpushのLaravelを使用しないパターンを箇条書き、フロントエンド側は

2024.11.14

Logging

おはようございます.webpushのLaravelを使用しないパターンを箇条書き、フロントエンドは過去記事を参照ください.まずwebpushを使用するにはパブリックキーとシークレットキーが必要になります.下記のURLより発行してみてください.

https://web-push-codelab.glitch.me

フロントエンド側でサービスワーカーの登録された識別データをバックエンドに送信.

// db.php: データベース接続の設定
function getDbConnection() {
    $host = 'localhost';
    $dbname = 'your_database';
    $username = 'your_username';
    $password = 'your_password';

    try {
        $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $pdo;
    } catch (PDOException $e) {
        die("DB接続エラー: " . $e->getMessage());
    }
}

// endpoint_register.php: エンドポイントをデータベースに登録
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $endpoint = $_POST['endpoint'];
    $auth = $_POST['auth'];
    $p256dh = $_POST['p256dh'];

    if ($endpoint && $auth && $p256dh) {
        $pdo = getDbConnection();
        $stmt = $pdo->prepare("INSERT INTO push_subscriptions (endpoint, auth, p256dh) VALUES (?, ?, ?)");
        $stmt->execute([$endpoint, $auth, $p256dh]);
        echo "登録成功";
    } else {
        echo "エンドポイントデータが不完全です";
    }
}

バックエンド側で下記のようなコードでデータを保存します.

次にminishlink/web-pushというライブラリを使用し登録されたデータを元に送信処理を行います.

composer require minishlink/web-push
// message_send.php: データベースからエンドポイントを取得し、プッシュ通知を送信
require 'db.php';
require 'vendor/autoload.php';

use Minishlink\WebPush\WebPush;
use Minishlink\WebPush\Subscription;

// VAPIDキーの設定
$auth = [
    'VAPID' => [
        'subject' => 'https://example.com',
        'publicKey' => 'YOUR_PUBLIC_VAPID_KEY',
        'privateKey' => 'YOUR_PRIVATE_VAPID_KEY',
    ],
];

$webPush = new WebPush($auth);

// データベースからサブスクリプション情報を取得
$pdo = getDbConnection();
$stmt = $pdo->query("SELECT endpoint, auth, p256dh FROM push_subscriptions");
$subscriptions = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($subscriptions as $sub) {
    $subscription = Subscription::create([
        'endpoint' => $sub['endpoint'],
        'publicKey' => $sub['p256dh'],
        'authToken' => $sub['auth'],
    ]);

    // 送信するメッセージ
    $message = json_encode(['title' => '通知タイトル', 'body' => 'メッセージ内容']);

    // プッシュ通知の送信
    $webPush->sendNotification($subscription, $message);
}

// 送信キューの実行
foreach ($webPush->flush() as $report) {
    $endpoint = $report->getRequest()->getUri()->__toString();

    if ($report->isSuccess()) {
        echo "成功: {$endpoint}\n";
    } else {
        echo "失敗: {$endpoint}: {$report->getReason()}\n";
    }
}

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

$stmt, catch, endpoint, FETCH_ASSOC, foreach, getDbConnection, getMessage, Laravel, minishlink, MYSQL, PDO, PDOException, prepare, query, setAttribute, subscription, VALUES, vendor, Webpush, シークレットキー,

x.comのAPI(FREE)にて自分のユーザー情報を取得するには

2024.06.05

Logging

おはようございます.x.comのAPI(FREE)にて自分のユーザー情報を取得するにはってググってもv1.1の情報だらけだったので情報を記載します.v2対応です.一部、有料でないと取得できない部分があり返却もエラーで返ってきますが、雛形コードを記載します.

注意事項
TwitterOAuthというComposerライブラリを使用しています.
APIなどの値はご自身のAPIに合わしてください.

参考にしたサイト
https://developer.x.com/en/docs/twitter-api/users/lookup/api-reference/get-users-me

<?php
date_default_timezone_set('Asia/Tokyo');
require_once "../vendor/autoload.php";

use Abraham\TwitterOAuth\TwitterOAuth;

class xMyProfile
{

    public $connection = null;
    public $response = null;

    public function __construct()
    {
        $this->connection = new TwitterOAuth(APIKEY, APISECRET, ACCESSTOKEN, ACCESSTOKENSECRET);
        $this->connection->setApiVersion("2");
        $this->response = $this->connection->get('users/me', [
            'expansions'=>'pinned_tweet_id',
            'tweet.fields'=>implode(',',[
                'attachments',
                'author_id',
                'context_annotations',
                'conversation_id',
                'created_at',
                'edit_controls',
                'entities',
                'geo',
                'id',
                'in_reply_to_user_id',
                'lang',
                'non_public_metrics',
                'public_metrics',
                'organic_metrics',
                'promoted_metrics',
                'possibly_sensitive',
                'referenced_tweets',
                'reply_settings',
                'source',
                'text',
                'withheld'
            ]),
            'user.fields' => implode(',', [
                'created_at',
                'description',
                'entities',
                'id',
                'location',
                'most_recent_tweet_id',
                'name',
                'pinned_tweet_id',
                'profile_image_url',
                'protected',
                'public_metrics',
                'url',
                'username',
                'verified',
                'verified_type',
                'withheld'
            ])
        ]);
        return $this;
    }

    /**
     * プロフィール情報全てを取得
     */
    public function getMyProfile()
    {
        return $this->response;
    }
    /**
     * プロフィールアイコンURLを取得
     */
    public function getIconUrl()
    {
        return $this->response->data->profile_image_url;
    }
}
var_dump((new xMyProfile)->getMyProfile());
//print (new xMyProfile)->getIconUrl();

この記事はQiitaに掲載していた記事になります.

明日へ続く.

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

connection, construct, edit_controls, getIconUrl, getMyProfile, implode, lt, null, organic_metrics, print, promoted_metrics, public, qiita, quot, response, return, use AbrahamTwitterOAuthTwitterOAuth, users, vendor, X.com,

PHP言語版のソース・コード自動整形.

2024.05.26

Logging

おはようございます、PHP言語版のソース・コード自動整形(php-cs-fixer)ツールがあります.毎回プルリクエストをするとソース・コードが直されます😅.直されないようにするにはローカルでソース・コード自動整形を導入することで解決されます.

導入の仕方は下記の通りです.

composer require friendsofphp/php-cs-fixer --dev
vendor/bin/php-cs-fixer fix app 

これで毎回プルリクエストの時に自動整形が走らないような気がします.以前の会社ではソース・コード管理などは全然でしたので、其れに比べると今の会社はいろいろと業界の標準が知れて勉強になります.おそらく中小企業や大手で行われていることが、ここ一年で身についてきたのではないかなって思います.

ちなみにLaravelでは自動整形が入っているので下記のコマンドを打つことによりソース・コードの自動整形が走ります.

./vendor/bin/pint fix app

明日へ続く.

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

bin, composer require friendsofphp, dev, Laravel, php-cs-fixer, php-cs-fixer fix app, PHP言語版, pint fix app, vendor, コード, コード自動整形, コマンド, ソース, ツール, 中小企業, 仕方, 大手, 標準, 毎回プルリクエスト, 自動整形,

ダミー情報を生成する定番.

2024.03.29

Logging

ダミー情報を生成する定番を生成する定番のコードを記載します.
Composerを使用し’faker’をインストールします.

composer require fakerphp/faker

使用方法例のコードとしてcsv出力するコードを記載(下記).

<?php
require 'vendor/autoload.php';
use Faker\Factory;

class CsvGenerate{
    /**
     * ダミー情報を生成する
     * @param int $max
     * @return string
     */
    public function csvMake(int $max=0):string
    {
        $faker = Factory::create('ja_JP');
        $hasData = [];
        for($i=0;$i<$max;$i++){
            $datas = [];
            $datas[0] = $faker->name();
            $datas[1] = $faker->email();
            $datas[2] = $faker->phoneNumber();
            $datas[3] = $faker->address();
            $hasData[$i] = implode(',',$datas);
        }

        return implode(PHP_EOL,$hasData);
    }
}

print((new CsvGenerate)->csvMake(1000));
//file_put_contents('data.csv',(new CsvGenerate)->csvMake(1000));

実際使用する場合は、file_put_contents行のコメントを解除してください.
同階層にdata.csvファイルが作成されます.
尚、コマンドよりファイルを実行することを想定しています.

※参考にしたサイト
https://fakerphp.github.io/
https://qiita.com/kurosuke1117/items/c672405ac24b03af2a90

明日へ続く.

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

$datas, $hasData, Address, Composer, create, csvMake, faker’, gt, implode, items, lt, name, phoneNumber, php require, print, qiita.com, string, vendor,

blueSky画像複数投稿API。

2024.02.04

Logging

おはようございます、QiitaにblueSky画像複数投稿を行うにはどうしたら良いですか😌と質問が来たので速攻で回答しました。わからないことは聞くしかないよね。大体の人は答えてくれないけど自分はヒントを与えてそれでもわからない場合は答えを渡す。これは昔、自分はその方が良いじゃないかって思っていたけども・・・・どうなんですかねぇ🤔。あまりその人の力にはならないかも。

やはり考える力が必要になる職業なんで、やっぱ闇雲に質問して答えを知っても力にならないじゃないかって思います。悪いことではないけれど技術を手に入れたければ、自分でライブラリのソースコードを読んで頑張らないと駄目なんだろうと思っています。

そうするしか、今も昔も技術力付かないし新人はいろいろな人が書いたソースコードを読むべしだとも思っています、コードを書くよりも読む方が大変です。それ乗り越えないとこの職業は難しい教えてもらうでは身につかないだよなぁ~。

一応、質問の回答のソースコードをこちらでも掲載しておきます。

<?php
require '../vendor/autoload.php';
require 'config.php';
use \potibm\Bluesky\BlueskyApi;
use \potibm\Bluesky\BlueskyPostService;
use \potibm\Bluesky\Feed\Post;

class bluesky
{
    private $api = null;
    private $postService = null;

    public function __construct()
    {
        $this->api = new BlueskyApi(USER_NAME, APP_PASSWORD);
        $this->postService = new BlueskyPostService($this->api);
    }

    /**
     * 簡単なテキスト投稿
     * @param $text
     * @return object
     */
    public function post($text)
    {
        $post = Post::create($text);
        $response = $this->api->createRecord($post);
        return $response;
    }

    /**
     * link付き投稿
     * @param $text
     * @param $url
     * @param $title
     * @param $description
     * @param $optionalimage|null
     * @return object
     */
    public function webPost($text,$url,$title,$description,$optionalimage=null)
    {
        $post = Post::create($text);
        $post = $this->postService->addWebsiteCard(
            $post, 
            $url, 
            $title, 
            $description,
            $optionalimage,
        );
        $response = $this->api->createRecord($post);
        return $response;
    }
    
    /**
     * 画像投稿
     * @param $text
     * @param $ImgLinkAndAltText
     * @return object
     */
    public function imagePost($text, $ImgLinkAndAltText=[])
    {
        $post = Post::create($text);
        $response = null;
        foreach($ImgLinkAndAltText as $val){
            $post = $this->postService->addImage(
                $post,
                $val['img'],
                $val['alt']
            );
        }
        $response = $this->api->createRecord($post);
        return $response;
    }
}
if($argv[0]){
    try {
        var_dump((new bluesky)->post('これはテスト投稿ですよ'));
        //var_dump((new bluesky)->imagePost('これは画像テスト投稿ですよ',[['img'=>'cron.png.webp','alt'=>'クロン'],['img'=>'Gotcha.png.webp','alt'=>'ガチャ']]));
        } catch (\Throwable $th) {
        print $th->getMessage();
        //throw $th;
    }
}

明日へ続く。

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

addImage, addWebsiteCard, argv, catch, construct, createRecord, foreach, getMessage, imagePost, PARAM, postService, potibmBlueskyBlueskyApi, potibmBlueskyBlueskyPostService, print, qiita, require, throw, Throwable, use, vendor,

PHP言語でblueskyの自動投稿を作ってみた。

2024.01.12

Logging

おはようございます。blueskyの自動投稿を作ってみたくなり即興で作りました。因みにblueskyの開発ドキュメントに記載されていたライブラリを使用しています。トライしてみて案外簡単に作れたのでライブラリに感謝だと感じました🙇。なお、自分のブルースカイアカウントのpost/3khojypfnf62zとpost/3khok6quxgj23が自動投稿(コマンドラインからの投稿)になります。

動作環境・sakuraれんたるサーバー・PHP8.2

作成手順

①アプリのパスワードを作成
https://bsky.app/settings/app-passwords
potibm/phluesky(v0.3.0)をインストールする(composerのインストールはご自身で調べてください)

composer require potibm/phluesky:"0.3.0"

③php8.2.bluesky.phpと同じ階層にconfig.phpを作成しdefineを設定する。
画像はphp8.2.bluesky.phpと同じ階層に置いているものとします。
USER_NAMEはプロフィールページに記載されている@の後のあかうんと名.bsky.social、 APP_PASSWORDは①で作成したパスワードになります。

④コマンドラインより実行する。なお、vendorの配置などで参照先は変わります。

php php8.2.bluesky.php
<?php
require '../vendor/autoload.php';
require 'config.php';
use \potibm\Bluesky\BlueskyApi;
use \potibm\Bluesky\BlueskyPostService;
use \potibm\Bluesky\Feed\Post;

class bluesky
{
    private $api = null;
    private $postService = null;

    public function __construct()
    {
        $this->api = new BlueskyApi(USER_NAME, APP_PASSWORD);
        $this->postService = new BlueskyPostService($this->api);
    }

    /**
     * 簡単なテキスト投稿
     * @param $text
     * @return object
     */
    public function post($text)
    {
        $post = Post::create($text);
        $response = $this->api->createRecord($post);
        return $response;
    }

    /**
     * link付き投稿
     * @param $text
     * @param $url
     * @param $title
     * @param $description
     * @param $optionalimage|null
     * @return object
     */
    public function webPost($text,$url,$title,$description,$optionalimage=null)
    {
        $post = Post::create($text);
        $post = $this->postService->addWebsiteCard(
            $post, 
            $url, 
            $title, 
            $description,
            $optionalimage,
        );
        $response = $this->api->createRecord($post);
        return $response;
    }
    
    /**
     * 画像投稿
     * @param $text
     * @param $imgLink
     * @param $altText
     * @return object
     */
    public function imagePost($text, $imgLink, $altText)
    {
        $post = Post::create($text);
        $post = $this->postService->addImage(
            $post,
            $imgLink,
            $altText
        );
        $response = $this->api->createRecord($post);
        return $response;
    }
}
if($argv[0]){
    try {
        var_dump((new bluesky)->post('これはテスト投稿ですよ'));
        var_dump((new bluesky)->imagePost('これは画像テスト投稿ですよ','cron.png.webp','クロン'));    
    } catch (\Throwable $th) {
        print $th->getMessage();
        //throw $th;
    }
}

最後に、cron設定などはご自身で調べてください。
ありがとうございました🙇。

こちらの記事はQiitaで記載されている自分の記事のコピーになります。
https://qiita.com/taoka-toshiaki/items/1508f4e79ea592565cef

明日へ続く。

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

addImage, addWebsiteCard, argv, bluesky, catch, Composer, construct, createRecord, define, getMessage, imagePost, PARAM, phluesky, postService, potibm, potibmBlueskyBlueskyApi, potibmBlueskyBlueskyPostService, print, Throwable, vendor,

Photo by Pixabay on Pexels.com

#久しぶりのコード`Xにポストするコード`

2023.11.17

Logging

おはよう御座います、さて正月休みは11日ぐらいあります、いやー正月休みはネトフリとゲームざんまいしてみたいと思っているのですが、結局どこかに出ていったりとかして目標達成できずにズルズルと休みを過ごすことになりそうです。👈前と言っていることが違いますね🙇。

さて、久しぶりにコードを書きました、この記事だけ見るとプログラマーじゃないかって思われるので最初に記載しときます。毎日のように仕事ではコードを書いています、仕事以外でコードを書いたのは一週間ぶりかなぁ。でも、このコードはポストでも書いている通り、特に難しいコードでもないのでオープンに公開しました。

このコードには必要ないコードが紛れているのはこのコードが使いましたコードだからです😂。

<?php
date_default_timezone_set('Asia/Tokyo');
ini_set("display_errors", 0);
require_once "../tw-config-v2.php";
require_once "../vendor/autoload.php";

use Abraham\TwitterOAuth\TwitterOAuth;

class merukari{
    public $connection = null;
    public $pdo = null;

    public function __construct()
    {
        $this->connection = new TwitterOAuth(APIKEY, APISECRET,ACCESSTOKEN,ACCESSTOKENSECRET);
        $this->connection->setApiVersion("2");
    }

    public function tweet($pattern)
    {
        $result = $this->connection->post("tweets", ["text" =>$pattern], true);
    }
    
    public static function pattern()
    {
        $pattern = [
            'メルカリで参考書を取り扱ってます📖 どれも綺麗な状態です。#学び #python Cシャープ #プログラム ⏭ https://jp.mercari.com/user/profile/808093563',
            'メルカリで参考書を出品してます📖 どれも綺麗な状態です。#学び #機械学習 #AI #プログラム ⏭ https://jp.mercari.com/user/profile/808093563',
            'メルカリで参考書を売ってます📖 どれも綺麗な状態です。#学び #人工知能 #python #プログラム ⏭ https://jp.mercari.com/user/profile/808093563',
            'メルカリで参考書を取り扱ってますよ📖 どれも綺麗な状態です。#学び #テック #企業 #学び #プログラム ⏭ https://jp.mercari.com/user/profile/808093563',
        ];

        return $pattern[ (int)rand(0,(count($pattern)-1))];
    }
}

try {
    if($argv[1] === 'merukari'){
        (new merukari())->tweet(merukari::pattern());
    }
} catch (\Throwable $th) {
    //throw $th;
}

もしかしたら、以前にもコードを公開して2回目になっていたりするかも知れません。そうだったらごめんなさい、無駄に記事を量産しています(反省。

そうそうXのハッシュタグ廃止は誤解だそうです。思い出したので書いときます、、、。

明日へ続く。

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

argv, Asia, catch, connection, construct, int, lt, null, pattern, Python, quot, rand, return, throw, Throwable, true, try, Tweet, use AbrahamTwitterOAuthTwitterOAuth, vendor,

ツイッターのDM内容をOpenAI api(chatGPT)で判別しスパムの場合ブロックする。#ソースコード

2023.04.17

Logging

おはようございます、スパムをブロックするソースコードを掲載します。ご自由にご使用いただけばと思っています。これを作ったのは先週の日曜日のことです、TwitterのDMに悩まされていたので何か方法はないかなって思って作ったのがこれです。実際、自分は試しに導入してみたのですが、精度はまずまず良い結果でした。因みに自分は作ったのですが今のところ、使ったのは先週の日曜日だけで未だに手動でブロックしています。使わない理由は大量のスパムが来ているわけではないので、特に問題は無いからです。唯、大量のスパムが来ている人にはそれなりにお役に立てるツールかも知れないです。

ツイッターのDM内容をOpenAI api(chatGPT)で判別しスパムの場合ブロックする。

スパム精度は結構良いです。

使用方法

  • コマンドで実行
php BlockMessage.php spamcheck

使用したComposerのライブラリ

  • TwitterOAuth
  • openai-php/client

phpのバージョン

  • php8.1

前提条件

  • 掲載していないファイルは推測して作ってください。
<?php
require_once "../vendor/autoload.php";
require_once "../tw-config-v2.php";
require_once "../openAI-config.php";

use Abraham\TwitterOAuth\TwitterOAuth;

class BlockMessage
{
    var $connection = null;

    public function __construct()
    {
        $this->twitterConnection();
        $result = $this->getTwitterDM();
        if(!$this->judgmentSpam($result[0])){
            $this->setTwitterBlockedUser($result[1]);
        }
    }

    public function twitterConnection()
    {
        // TwitterOAuthクラスのインスタンスを作成する
        $this->connection = new TwitterOAuth(APIKEY, APISECRET, ACCESSTOKEN, ACCESSTOKENSECRET);
        // APIバージョンを設定する
        $this->connection->setApiVersion('2');
    }

    /**
     * DMを取得する
     * @return array 
     */
    public function getTwitterDM()
    {
        $dm_events = $this->connection->get('dm_events',["expansions"=>"sender_id","user.fields"=>"username,id"]);
        return [$dm_events->data[0]->text,$dm_events->data[0]->sender_id,$dm_events->data[0]->id];
    }
    /**
     * OpenAI APIを使用してスパム判定
     * @param string $text
     * @return false
     */
    public function judgmentSpam(string $text="")
    {
        if (!$text) return false;
        $client = OpenAI::client(OPENAIAPIKEY);
        $result = $client->chat()->create([
            'model' => 'gpt-3.5-turbo',
            'messages' => [
                ["role"=>"system", "content"=>'Your job is to identify spam, please determine if the message is spam or not. If it is spam, please write "This is spam". For non-spam messages, write "OK".'],
                ["role"=>"system", "content"=>'respond to in English.'],
                ['role'=> 'user', 'content' => $text],
            ]
        ]);
        if(preg_match("/(OK)/i",$result->choices[0]->message->content)){
            print "non-spam".PHP_EOL;
            return true;    
        }
        if(preg_match("/(spam)/i",$result->choices[0]->message->content)){
            print "This is spam".PHP_EOL;
            return false;
        }
        return true;
    }

    /**
     * スパムアカウントをブロック
     * @param string $blocked_user_id
     * @return false
     */
    public function setTwitterBlockedUser(string $blocked_user_id = "")
    {
        if (!$blocked_user_id) return false;

        $block_result = $this->connection->post('users/'.MYTWID.'/blocking', ['target_user_id' => $blocked_user_id], true);
        if ($block_result->data->blocking) {
            print 'Blocked user successfully.'.PHP_EOL;
            return true;
        } else {
            print 'Failed to block user.'.PHP_EOL;
            return false;
        }
    }
}
if($argv[1]==="spamcheck"){
    new BlockMessage();
}

https://github.com/taoka-toshiaki/BlockMessage

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

argv, chat, ChatGPT, choices, Client, Composer, connection, construct, getTwitterDM, messages, OPENAIAPIKEY, print, quot, spam, spamcheck, string, Twitter, twitterConnection, TwitterOAuth, vendor,

dockerとlaravel(ローカルと同期していると遅くなる。)

2022.12.26

Logging

おはようございます、先日は雪が降りましたね_(:3」∠)_。今日も寒い日になりそうです☃。

さて、Laravelを勉強して昨日の時点でLaravelの参考書は終盤になっています。月曜日には入門書はコンプリート出来そうです。自分はDockerを使って環境を作っているのですが、Laravelのファイルをローカルに置きDockerで走らせているのですが、どうもブラウザで見る際も常に全ての同期処理がバックグラウンドで走っているらしく、とても表示するのにストレス(遅延)を感じていました。

それを解消する方法はないかと探していた所、@ucan-labさんと@suinさんがヒントを記載していました。下記のヒントから、vendorをローカルに同期しないようにしてDocker内にコピーする方法に変更した所、Qiitaに記載している通り、レスポンスがかなり早くなりました。爆速で表示されるようになりました😲。

docker container cp vendor コンテナ名:/var/www/html/example-app

追伸

vendor及びstorageのframeworkの配下も同じようにすると早くなりますよ。エラーが出るのでパーミッションの777に変更することもお忘れなく!!!!Composerのインストールでエラーが出る場合は下記を叩いてみてください。

mkdir -p storage/framework/cache/data/
mkdir -p storage/framework/app/cache
mkdir -p storage/framework/sessions
mkdir -p storage/framework/views

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

App, cache mkdir, Composer, data, docker, example-app, Framework, Laravel, qiita, sessions mkdir, storage, ucan-labさん, var, vendor, Volume, パーミッション, 爆速, 置きDocker, 追伸, 配下,

Photo by Pixabay on Pexels.com

Twitter-API-v2ツイート数珠繋ぎ #コード公開 #php

2022.10.04

Logging

おはようございます。土日祝も関係なくブログは毎日書いています🤮。

さて、今日はPHP言語でTwitterAPIバージョン2(v2)を使用してツイート数珠繋ぎをする方法を抜粋して記載していきます。こういうコードは今のところ出回っていないようです。少し調べれば公式サイトに記載しているのだけども・・・。まだ、日本語に対応した記事が少ないようです。v2でツイートする方法やリツイートする方法は何故かあるのだけどリプライ(Reply)[/statuses/update]する方法が記事としては記載していなかったので?記載します。

<?php
require_once "vendor/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;

class tw{
    var $connection = null;
    function __construct()
    {
        $this->connection = new TwitterOAuth(APIKEY, APISECRET,ACCESSTOKEN, ACCESSTOKENSECRET);
        $this->connection->setApiVersion("2");
    }

    function pickup_tweets(mixed $tw_text=null){
         $obj = (object)[];
        if(isset($tw_text) && is_array($tw_text)){
            foreach ($tw_text as $key => $value) {
                if(preg_replace("/[ | ]/","",$value)){
                    $obj = !$key?(
                        $this->connection->post("tweets", ["text" =>$value], true)
                    ):
                    (
                        $this->connection->post("tweets", ["reply"=>["in_reply_to_tweet_id"=>$obj->data->id],"text"=> $value], true)
                    );
                }
            }
            return true;
        }
        return false;
    }
}

最初に結論とコードのアルゴリズムに付いて解説します。まず、tweetsのパラメーターでリプライ出来るように変更されています。v1.1とはそこが変わっているので同じ仕組みを検索しがちですがそれでは検索にヒットしないようです🤔。まずはエンドポイントの変更点の確認が必要みたい👏。

エンドポイントのv1.1からv2への対応表

エンドポイントのv1.1からv2への対応表が公式から出ているので確認してみてください↑。

次にコードの解説ですがまずTwitterOAuthライブラリをインストールを行い、defineなどの設定なども考慮した上で実行してみてください(コードに追記記載が必要)。変数、$tw_textは配列です。また投稿する文字が入っていると考えてください。そしてこのコードを下記のような考え方で実行してみてください。

<?php
       require_once "tw-index.php";
       $tw_text[0] ="test1";
       $tw_text[1] ="test2";
       $tw = new tw();
       if($tw->pickup_tweets($tw_text)){
        $ret["msg"] = "ok";
       }else{
        $ret["msg"] = "NG";
       }
       var_dump($ret);

※前提条件としてtwitter社にAPIの申請を行って受理されている事。

Twitter API v2 ツイート数珠繋ぎ

これで思った通り実行出来たと思います。尚、自分のように管理画面などを作って数珠繋ぎの投稿するのも良いかも知れません🫠。

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

2, Abraham, autoload, class, connection, function, lt, null, once, php, quot, Reply, require, statuses, tw, Twitter-API-v, TwitterAPI, TwitterOAuth, UPDATE, use, var, vendor, コード, サイト, ツイート, ところ, バージョン, ブログ, リツイート, リプライ, , 今日, 使用, 公式, 公開, 土日, 対応, 少し, 抜粋, 数珠繋ぎ, 方法, 日本語, 毎日, , 言語, 記事, 記載,

数珠繋ぎにTweet(リプライ)するPHP言語のコードは意外にも簡単。

2021.08.28

Logging

先日、高知県はコロナ感染症が111人になったそうです。早くコロナワクチン接種?2回目を打ちたいです、ただファイザー社のワクチンなのでデルタ株のウィルスは軽症化させるだけで無症状や感染しないようにはならないという事です。それでも重症化を防げるので打たないより打った方が良いですね?。なお、混合ワクチン接種が結構無敵だとか?インドではDNAワクチン接種を世界初で承認したみたいですね。新たな変異種も防ぐことが出来れば一気にDNAワクチン接種が世界的に進みそうです。

さて、前置きはここまでとして、数珠繋ぎにTweet(リプライ)するPHP言語のコードは意外にも簡単に書けました、なお、TwitterOAuthというライブラリを使用して呟いています。

作った経緯は数珠繋ぎにする方法などは調べてもヒットしなかったので記載しようと思ったわけです。今回の方法でアファリエイトなどを紹介などや長文のツイートが行えるなどいろいろな用途に使えるかと思います。

※このソースコードはコマンドライン(CUI)から叩かないと(実行)、動かない仕様になっています。

<?php
require_once("../vendor/autoload.php");
use Abraham\TwitterOAuth\TwitterOAuth;
if ($argv[0]) {
    require_once "./tw-config.php";
    $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
    date_default_timezone_set('Asia/Tokyo');
    $affiliate = json_decode(file_get_contents("./affiliate.json"));
    $id = null;
    foreach ($affiliate->{date("w")} as $key=>$val) {
        $str = $id?array("status"=>$affiliate->{date("w")}[$key]->txt,"in_reply_to_status_id"=>$id):array("status"=>$affiliate->{date("w")}[$key]->txt);
        $res = $connection->post("statuses/update",$str);
        $id = $res->id;
    }
}
{
    "0": [
        {
            "txt": ""
        },
        {
            "txt": "2"
        },
        {
            "txt": "3"
        }
    ],
    "1": [
        {
            "txt": "1"
        },
        {
            "txt": "2"
        },
        {
            "txt": "3"
        }
    ],
    "2": [
        {
            "txt": "1"
        },
        {
            "txt": "2"
        },
        {
            "txt": "3"
        }
    ],
    "3": [
        {
            "txt": "1"
        },
        {
            "txt": "2"
        },
        {
            "txt": "3"
        }
    ],
    "4": [
        {
            "txt": "1"
        },
        {
            "txt": "2"
        },
        {
            "txt": "3"
        }
    ],
    "5": [
        {
            "txt": "1"
        },
        {
            "txt": "2"
        },
        {
            "txt": "3"
        }
    ],
    "6": [
        {
            "txt": "1"
        },
        {
            "txt": "2"
        },
        {
            "txt": "3"
        }
    ]
}

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

$affiliate, argv, Asia, connection, CUI, date, foreach, gt, json_decode, lt, null, php require_once, quot, TwitterOAuth, txt, use AbrahamTwitterOAuthTwitterOAuth, val, vendor, アファリエイト, コマンドライン,

アンフォローが多発しているのでアンフォローした人には自動でお礼コメントする。

2021.07.15

Logging

アンフォローが多発しているのでアンフォローした人には自動でお礼コメントするようにプログラミングコードを書いて五分間で処理を実行するようにcrontabに設定しました。ソースコードの一部を記載しますのでご自分の環境に合わしてご自由にお使いくださいませ。尚、TwitterOAuthライブラリを使用しておりますが、ライブラリの導入などに関しては割愛しております。

何故、こんなコードを書いたのか余談。フォロワーさんが外れるのはあまり嬉しいことではないですよね。離れていく人を食い止めようとは思いませんが、最後のお礼コメントぐらい言わせてくださいなという考えの元、今回のお礼コメントをするPHPのコードを書きました。相変わらずソースコードにコメントはありません、悪しからず?。

尚、一回目は一部コメントアウトして実行ください?

<?php
require_once("../vendor/autoload.php");

use Abraham\TwitterOAuth\TwitterOAuth;

if ($argv[0]) {
    require_once "./tw-config.php";
    $f_data = @file_get_contents("followers.dat");
    $f_data = $f_data?explode(PHP_EOL,$f_data):[];     

    date_default_timezone_set('Asia/Tokyo');
    $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
    $response = $connection->get("followers/ids", array(
        'screen_name' => 'zip358com',
        'count'=>1000
    ));

    $unFolloewers = array_diff($f_data,$response->ids);
    $data = @implode(PHP_EOL,$response->ids);
    file_put_contents("followers.dat",$data);

    if($unFolloewers){
        foreach($unFolloewers as $key=>$val){
            $response = $connection->get("users/show", array(
                'user_id' =>$val
            ));
            $text = "@".$response->screen_name. " さん 今までフォローありがとうございました(¯―¯?)。{フォロー解除されました? ([atmark]zip358comより自動投稿)}";
            print $text;
            $connection->post("statuses/update", array("status" => $text . " \n"));
        }
    }
}

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

aut, crontab, lt, once, php, quot, require, TwitterOAuth, vendor, アウト, アン, お使い, お礼, コード, こと, コメント, ご自分, ソース, フォロー, フォロワー, プログラミング, ライブラリ, , 一部, , , 今回, 何故, 余談, 使用, , 処理, 割愛, 多発, 実行, 導入, 最後, 環境, 自動, 記載, 設定,

PHP7でTwigを使う。

2020.05.10

Logging

Twigとは小枝であり、PHPのテンプレートエンジンであります。テンプレートエンジンが何なのかはぐぐってください。ここでは割愛します。

Twig3.x(3系)、Dumpの表示の仕方が書かれていないのでそれを記載します。記載方法は下記になります。特に記載方法が変わったのはデバッグの時の記述方法です、最初、デバッグ方法をググっていたのですが、全然上手くいかずエラーばかりはいていました。※Twig2系の情報が結構ヒットします。

require_once '/vendor/autoload.php';
$loader = new \Twig\Loader\FilesystemLoader('テンプレートの階層を指定');
$twig = new \Twig\Environment($loader,['debug' => true]);
$twig->addExtension(new \Twig\Extension\DebugExtension());//?ここの記述を忘れずに!!
echo $twig->render('index.html(レンダーするテンプレートファイル)', ['items'=>$this->top_view()]);

結局、公式ページのドキュメントにデバッグ方法が書かれていたのですが、それにたどり着くまで、小一時間ぐらいWEBの荒野をさまよっていました。最初からドキュメントを見ろよという教訓を得たのですが、結構ググる方を優先してしまう自分がいます。実際はドキュメントの中で検索するのが一番なのかもなと。皆さんが使用するようなエンジンはドキュメントを見るほうが良いと今回、痛感しました。これからはドキュメントを見るようにします。

https://twig.symfony.com/doc/3.x/functions/dump.html

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

2, , 39, 7, addExtension, autoload, debug, dump, Environment, FilesystemLoader, gt, loader, new, once, php, require, true, Twig, vendor, エラー, エンジン, ここ, それ, デバッグ, テンプレート, ヒット, 下記, 仕方, , 割愛, 小枝, 情報, 指定, 方法, , 最初, 表示, 記載, 記述, 階層,

Gさんのリアルタイム検索トレンドを抽出するPHPライブラリ

2020.04.15

Logging

Composerをインストールしていること前提条件として書いていきます。まずはライブラリーを入れます。

こんな感じに

composer require x-fran/g-trends

そして次にこんな感じのPHPコードを書きます、これだけでGさん(グーグルさん)のリアルタイム検索トレンドが表示することが可能となります。ちなみにJSONで返す処理として書いています。ライブラリーがしっかりしているので、あとはメソッドを呼び出すだけで簡単に検索のリアルタイムのトレンドが表示できてしまう。

ライブラリーコードは下記から参照できます。
https://github.com/x-fran/g-trends

<?php
include_once "../../vendor/autoload.php";
use XFran\GTrends\GTrends;
$options = [
    'hl' => 'ja-JP',
    'tz' => -540,
    'geo' => 'JP',
];
if((int)$_POST["p"]==1234){
    $gt =  new GTrends($options);
    $ret = $gt->getRealTimeSearchTrends();
    if(is_array($ret["storySummaries"]["trendingStories"])){
        $jsn = json_encode($ret["storySummaries"]["trendingStories"]);
        print $jsn;
    }
}

尚、ajaxで表示している部分は割愛します。
https://zip358.com/tool/demo14/ demo14を検証ください。

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

autoload, com, Composer, g-trends, github, GTrends, https, include, json, lt, once, options, php, quot, require, use, vendor, x-fran, XFran, あと, インストール, グーグル, コード, こと, これだけ, トレンド, メソッド, ライブラリ, ライブラリー, リアルタイム, 下記, 処理, 前提, 参照, 可能, 感じ, 抽出, 条件, 検索, 簡単, 表示,

WordPressの全記事の中からランダムで記事をピックアップしてツイートする。

2019.02.22

Logging

WordPressの全記事の中からランダムで記事をピックアップしてツイートする。
実際、自分の階層に合わして呼び出しを変更してください。
なお、さくらレンタルサーバーでクロンの設定をして自動投稿できます。
ライブラリの設置などは割愛してます。

<?php
// cron:: cd /home/user/www/zip358.com/site/tw; /usr/local/bin/php tw.php
require_once ('../../wp-load.php');
require "vendor/autoload.php";
use AbrahamTwitterOAuthTwitterOAuth;
$consumer_key = "XXXXXXXXXXXXXX";
$consumer_secret = "XXXXXXXXXXXX";
$access_token = "XXXXXXXXXXXXXX";
$access_token_secret = "XXXXXXXXXXXXXXX";
$to = new TwitterOAuth($consumer_key,$consumer_secret,$access_token,$access_token_secret);
$args = array(
	'posts_per_page' => 1,
    'orderby' => 'rand'
);
$posts = get_posts($args);
foreach ( $posts as $val ){
    $href =  get_permalink($val->ID);
    $title = get_the_title($val->ID);
    $res = $to->post("statuses/update", array("status" => $title . " " . $href));
}

著者名  @taoka_toshiaki

※この記事は著者が30代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

358, Abraham, access, autoload, bin, cd, com, consumer, cron, home, key, local, lt, once, php, require, secret, site, tok, tw, TwitterOAuth, use, user, usr, vendor, WordPress, wp-load, XXXXXXXXXXXX, XXXXXXXXXXXXXX, zip, クロン, サーバー, さくら, ツイート, ピックアップ, ライブラリ, ランダム, レンタル, , 割愛, 変更, 実際, 投稿, 自分, 自動, 記事, 設定, 設置, 階層,

Twitterの画像を抽出、非API

2018.11.07

Logging

Twitterの画像を抽出、非API
Goutteライブラリを使用してTwitterのメディアを抽出するだけで
APIを使用せずに17枚の画像が抽出することが可能。
これを改良してスクロールさせながらってのは出来ないのではないかな
特にVPSじゃないレンタルサーバーなどでは不可能じゃないのかと思います。

require_once './vendor/autoload.php';
use Goutte\Client;
$client = new Client();
$crawler = $client->request('GET','https://twitter.com/xxxx/media');
$img = $crawler->filter(".AdaptiveMedia-photoContainer.js-adaptive-photo img")->each(function ($node){
return $node->attr('src');
});

著者名  @taoka_toshiaki

※この記事は著者が30代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

'src', 17, AdaptiveMedia-photoContainer, API, APITwitter, attr, autoload, Client, com, crawler, each, filter, function, GET, Goutte, gt, img, js-adaptive-photo, media', new, node, once, php, request, require, return, Twitter, use, vendor, VPS, xxxx, こと, これ, サーバー, スクロール, ない, メディア, ライブラリ, レンタル, 不可能, 使用, 出来, 可能, 思い, 抽出, 改良, , 特に, 画像, ,