Photo by Victor Freitas on Pexels.com

文章を解析して#を付与して返却。

2024.03.04

Logging

おはようございます、文章を解析して#を付与して返却…Qiitaの丸コピです
SNSでの使用することを考えて作りました。文章を解析して名詞と形容詞の文字の先頭に#を付与して返却します😌。

レンタルサーバーでは動きませんがawsやgcp,vpsなどでは動く作りになっています。
作った経緯はこういうサービスが無かったので作りました?。

因みにexecの脆弱性が気になるところですので対応が必要かもです🙇。

※phpやPythonのインストールはご自身で行ってください。

#前処理 mecab-python3バージョンは1.0.8です
sudo apt-get install mecab libmecab-dev mecab-ipadic-utf8
sudo pip install mecab-python3
pip install unidic-lite
<?php
class sharpPost
{
    /**
     * mecab.pyを使って文章を解析(名詞と形容詞を取り出す)
     * @param $posstData
     * @return array|null
     */
    public function analysis($postData)
    {
        if(!$postData)return null;
        $word = null;
        exec('python py/mecab.py "'.strip_tags(htmlentities($postData)).'"',$output);// 2>&1
        if(is_array($output)){
            foreach($output as $val){
                $analysisWord = explode("\t",$val);
                if(isset($analysisWord[1]) && preg_match('/(名詞|形容詞)/',$analysisWord[1])){
                    $word[] = $analysisWord[0];
                    $word = array_unique($word);
                }
            }
        }
        return $word;
    }
    
    /**
     * 文字列を置き換える処理
     * @param $postData
     * @param $word|null
     * @return string
     */
    public function replacePostData($postData='',$word=null)
    {
        if(is_array($word)){
            foreach($word as $val){
                $postData = preg_replace("/({$val})/u"," #{$val} ",$postData);
            }
        }
        return $postData;
    }
}
$textData = '単なる自分が使いたい機能です、無かったので作ってみただけです。';
$sharpPost = new sharpPost();
$word = $sharpPost->analysis($textData);
print(($sharpPost->replacePostData($textData,$word)).PHP_EOL);
import MeCab
import sys
args = sys.argv
if(args[1]):
    tagger = MeCab.Tagger()
    print(tagger.parse(args[1]))

著者名  @taoka_toshiaki

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

タグ

analysis, args, argv if, AWS, exec, explode, foreach, htmlentities, isset, PARAM, preg_match, preg_replace, print, qiita, quot, replacePostData, return, sharpPost, tagger, tagger.parse,

phpunitテストする際に

2024.02.17

Logging

おはようございます、Laravelの話なんだけどもphpunitTestする際にコントローラーのviewのparamっていうのかな?あのデータを取る方法が知りたいのだけど、ググってもchatGPTに投げても明確な答えが返ってこない…。因みにgetContent()っていうので、全返却データが取れることは知っているのだけども。

dd($response)で中身を見ると取得することが出来そうなんですけどねぇ。何故か出来ないのです、とても悔しい気持ちになったので、誰か知っている人はいないかと思って書いています。知っている人はレスをお願いしたいです。リモートワークってそこが聞けない聞きづらいなって思います、新人は中々大変だなって。

scenic view of a lightning in the sky
Photo by Debasish Vishal on Pexels.com

リモートワークでコロナ禍、働いていたIT新人組は結構たいへんな思いをしたのかもしれないなって思います。いまではchatGPTというちょっとペテン師な先生がいるのでちょっと前までよりか楽になったんじゃないでしょうか?

今回分からなかった事は、Qiitaに質問しても良いなって思っています。
(レスが付かずじまいだったらQiitaに質問します。)

明日へ続く。

著者名  @taoka_toshiaki

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

タグ

ChatGPT, dd, getContent, IT新人組, Laravel, PARAM, Photo by Debasish, qiita, response, view, Vishal on Pexels.com, コロナ禍, コントローラー, じまいだったらQiita, ペテン師, リモートワーク, 中身, 悔しい気持ち, 新人, 答え,

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','alt'=>'クロン'],['img'=>'Gotcha.png','alt'=>'ガチャ']]));
        } catch (\Throwable $th) {
        print $th->getMessage();
        //throw $th;
    }
}

明日へ続く。

著者名  @taoka_toshiaki

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

タグ

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

何かの役に立つ#bluesky

2024.01.29

Logging

おはようございます、QiitaにblueSkyのプロフィールURLからRSSを抽出するコードを書きました。先日、blueSkyにRSS機能を追加したという記事を読んだので、その日のうちに対応した形になります。

特に難しいコードでもないので、コメントは一切書いていませんが、それなりに役に立つと信じてリリースしました、ソースの改修などを行って頂けて構いませんが出来ればQiitaもしくはこちらの記事にリンクを貼っていただけたら幸いです。

PHP環境は8.2になっていますが、PHP7系でも動くソースコードなので安心してご使用いただけるかと思います。使用にあたって最終行はコメントアウトを行ってください、url変数も自分にあったurlに変えていただければと思います。

<?php
class blueSkyRss{
    public $rss = null;
    /**
     * __construct
     * @param $url
     * @return void
     */
    public function __construct($url)
    {
        try {
            $html = file_get_contents($url);
            preg_match('/https:\/\/bsky\.app\/profile\/did.*\/rss/',$html,$matches);
            if($rssUrl = $matches[0]){
                $feed = simplexml_load_file($rssUrl);
                $this->rss = $feed;    
            }
        } catch (\Throwable $th) {
            //throw $th;
        }
    }
    /**
     * getRss
     * @return object
     */
    public function getRss():object
    {
        $response = [];
        if(isset($this->rss->channel)){
            $cnt = 0;
            foreach($this->rss->channel->item as $item){
                $response[$cnt]['link']    = $item->link;
                $response[$cnt]['comment']   = $item->description;
                $response[$cnt]['date'] = $item->pubDate;
                $cnt++;
            }
        }
        return (object)$response;
    }
}
$url = 'https://bsky.app/profile/xxxxxxx.bsky.social';
//var_dump((new blueSkyRss($url))->getRss());

明日へ続く。

著者名  @taoka_toshiaki

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

タグ

bluesky, catch, cnt, construct, description, did, foreach, getRss, isset, lt, object, PARAM, preg_match, pubDate, qiita, return, RSS, throw, Throwable, try,

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','クロン'));    
    } catch (\Throwable $th) {
        print $th->getMessage();
        //throw $th;
    }
}

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

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

明日へ続く。

著者名  @taoka_toshiaki

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

タグ

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

Twitter API V2では画像ツイートが出来ないと流れてきたので対処方法

2023.06.02

Logging

おはようございます。先日、Twitter API V2では画像ツイートが出来ないと流れてきたので対処方法を載せときます。Qiitaにも掲載していますが、こちらでも記載します。コードはいつまで使用出来るかは不明ですね、イーロン・マスクのサジカゲンで無料プランでは出来なくなる可能性を秘めています。今のところ、使用できるコードです。PHP8系では動きますがPHP7系は:mixedの部分を退けてあげないと動かないかもです。因みにPythonのサンプルコードが公式にはあったような気がします。

<?php

require_once "tw-config-v2.php";
require_once "vendor/autoload.php";

use Abraham\TwitterOAuth\TwitterOAuth;

class tw
{
    public $connection = null;
    public $media = null;
    public function __construct()
    {
        $this->connection = new TwitterOAuth(APIKEY, APISECRET, ACCESSTOKEN, ACCESSTOKENSECRET);
    }

    /**
     * イメージのエンドポイントを取得する v1.1 そのうち廃止されそう。
     * @param $imageName
     * @return boolean
     */
    public function getImage($imageName = null): bool
    {
        if (empty($imageName)) {
            return false;
        }
        $this->media = $this->connection->upload('media/upload', ['media' => "/var/www/html/tw/tmp/images/$imageName"]);
        return true;
    }

    /**
     * イメージ付きでツイート。
     * @param $text
     * @return mixed
     */
    public function tweet($text = null): mixed
    {
        if (!empty($text) && isset($this->media->media_id_string)) {
            $param = [
                'text' => $text,
                'media' => [
                    'media_ids' => [
                        $this->media->media_id_string
                    ]
                ]
            ];
            $this->connection->setApiVersion('2');
            return $this->connection->post('tweets', $param, true);
        }
        return false;
    }
}

if($argv[0]){
    $tw = new tw();
    if($tw->getImage("php2023.png"))
    {
        $tw->tweet("これはテストです");
    }    
}

著者名  @taoka_toshiaki

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

タグ

argv, bool, connection, construct, empty, getImage, isset, media', mixed, PARAM, qiita, quot, quot;vendor, return, tmp, tw, Tweet, use AbrahamTwitterOAuthTwitterOAuth, イーロン, サジカゲン,

Laravelのスケジュール覚書、初心を忘れずに。#chatGPTの罠

2023.04.18

Logging

おはようございます、laravelのスケジュールを触ってみて。躓いた点は一点だけ。スケジュールリストに登録されているけど、動作しなかった。chatGPT3の罠に引っかかりました。chatGPTはもっともらしいコードを書いてくれるけど、たまに動作しないコードも出力されます。それにまんまと引っかかり、沼から出てこれなくなる所でした。

Laravelはお利口さんだから、上手くやってくれるだろうとJob側のコンストラクタには何も記述しなかったのが間違い。コマンドで行わない場合は下記の記述は絶対らしい。

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Http;

class WebsiteMonitor implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
    }
    public function __invoke()
    {
        $this->handle();
    }
    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
     //行いたい処理🐺
    }
<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use App\Jobs\WebsiteMonitor;
class Kernel extends ConsoleKernel
{
    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        // どちらでもOK👉 $schedule->job(new WebsiteMonitor)->everyFifteenMinutes();
        $schedule->call(function () {
            dispatch(new WebsiteMonitor());
        })->everyFifteenMinutes();
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}

行いたい処理を書いたら、カーネルに処理を登録してcronに下記のように記述する。

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

これで処理が定期的に実行されます。尚、参考サイトとしてこちらに詳しい情報が書かれています。

著者名  @taoka_toshiaki

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

タグ

call, ChatGPT, construct, cron, dev, DIR, dispatch, everyFifteenMinutes, handle, IlluminateConsoleSchedulingSchedule, InteractsWithQueue, Laravel, load, PARAM, Queueable, routes, Schedule, SerializesModels, コンストラクタ,

Photo by Igor Haritanovich on Pexels.com

ワードプレスの自動タグ生成するプラグイン再開発。 #wp #tag

2022.12.12

Logging

おはようございます、今年もあと半分とちょっとですね、月曜日のたわわ☕。

さて、今日はワードプレスの自動タグ生成するプラグイン再開発しましたってお話です、この自動タグを生成するツールは以前、作っていたのですがYahoo!APIのバージョンアップに伴い使用出来なくなっていました。その為、プラグインを更新しV2対応をこの度、行ったって話です。もともと日本語記事のタグ自動生成するものは存在していたのですが、それがエラーで使用出来なくなり自分で開発したのが今に至っています。

プラグインをダウンロードして使いたい方は、zipファイルを解凍し解凍したフォルダをサーバーのプラグイン置き場にアップロードすることにより使用出来るようになります。尚、前手順としてYahoo!APIのアプリケーションIDの取得を行う必要があります。

プラグインをダウンロードしたくないという方のためにソースコードを一部貼っときます。

        if (isset($appid)) {
            $endpoint = "https://jlp.yahooapis.jp/KeyphraseService/V2/extract";
            $headers = [
                "Content-Type: application/json",
                "User-Agent: Yahoo AppID: ".$appid,
            ]; 
            $param = [
                "id"=> time(),
                "jsonrpc" => "2.0",
                "method" => "jlp.keyphraseservice.extract",
                "params" => [
                    "q"=>preg_replace("/https?:([a-zA-Z0-9|\/|_|\-|%|@|\*|\.|\?|&|=]){0,}/m","",$content)
                    ]
                ];

                $curl=curl_init($endpoint);
                curl_setopt($curl,CURLOPT_POST, TRUE);
                curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
                curl_setopt($curl,CURLOPT_POSTFIELDS, json_encode($param));
                curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, FALSE);
                curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, FALSE);
                curl_setopt($curl,CURLOPT_RETURNTRANSFER, TRUE);
                
                $response =  json_decode(curl_exec($curl));


            if (isset($response->result->phrases)) {
                foreach ($response->result->phrases as $keys=>$word) {
                    if ($word->text) {
                        $tags[] = $word->text;
                    }
                    if (is_array($tags)) {
                        wp_set_post_tags($post_id, implode(",", array_unique($tags)), false);
                    }
                }
            }
        }

著者名  @taoka_toshiaki

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

タグ

application, false, foreach, gt, headers, implode, isset, jlp, json_decode, json_encode, keys, PARAM, phrases, quot, quot;User-Agent, response, result, Text, true, VERIFYHOST,