【PHP】下らねぇ質問はここに書き込みやがれ 10

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ cfe8-+65u)
垢版 |
2018/11/28(水) 17:08:46.02ID:Nb5yTkdM0
PHPに関する質問スレです

前スレ
【PHP】下らねぇ質問はここに書き込みやがれ 9
http://mevius.5ch.net/test/read.cgi/tech/1513760420/

次スレは>>980以降
本文の1行目に以下を追加すること
!extend:on:vvvvv:1000:512
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2020/01/08(水) 18:37:40.91ID:Bxyfcf/k0
08と09は8進表記であり得ないからInvalid numeric literal
素直に頭文字0を削除すればいいのに
2020/01/08(水) 18:47:21.77ID:Z7OGNEnI0
>>671
そもそもなんだけど、関数の引数で $time_array が渡されたとき、その添字はどんな形式になってるの?
$hour は文字列なんだから、元々配列の添字は文字列であるべきだったように見えるけど。

それはそれとして、小さなフラグテーブルなら文字列で書く方法もあるかもね。

$timetbl = '000000000011111111111100';

return $timetbl[(int)$hour] === '1';

みたいな。
その例ではインタフェースを変更しないといけなくなるから適用しづらいだろうけど。
2020/01/08(水) 19:49:43.97ID:w19vYwgJ0
>>671
do_check_exec_time関数だけどさ
返却値が不規則ならともかく、10〜21の範囲ならtrue、それ以外はfalseで駄目なの?
引数範囲もチェックしたいなら、先頭行で行えば良いと思う
2020/01/08(水) 21:14:25.57ID:DD+ZGKXm0
レスを書くと forbiddenになったので、レスにNGワードが含まれているようです。
何がダメなんだろう・・・
レスは返したかったので画像にしました
https://i.imgur.com/XjOXs1g.jpg
2020/01/08(水) 22:18:06.43ID:zDxhP1FM0
PHPはJavaScriptなんかと違って文字連結とは演算子が別れてるから
+演算子は加算専用で数字として扱えるというか数値として扱うというのが正しい

>>667のコード見た感想としてはそこで初期値設定するか?って思ったわ
渡すべき$time_arrayの初期値としてならともかく
ちゃんとarrayのみ渡されるよう想定したほうがいいね
2020/01/08(水) 22:26:16.06ID:zDxhP1FM0
ちなみに勘違いしてなければいいけど
date関数のreturn値は文字列なんで08は正確には"08"
8進数でも他の数値的な何者かではなくただの文字列
678デフォルトの名無しさん (ワッチョイ 7fd4-ErPi)
垢版 |
2020/01/13(月) 21:12:24.20ID:KUUG8Hhj0
質問があります。もしわかる方がいましたらご教授頂きたいです。

htmlを読み込んでbodyタグの中のaタグに書かれている内容を表示させようとしています。
(このサイトを参考:https://blog.katty.in/1400

$url = 'https://haruoto.com/?page_id=11';
$html = file_get_contents($url);
$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'ASCII, JIS, UTF-8, EUC-JP, SJIS');
$domDocument = new DOMDocument();
$domDocument->loadHTML($html);
$xmlString = $domDocument->saveXML();
$xmlObject = simplexml_load_string($xmlString);
$array = json_decode(json_encode($xmlObject), true);
echo $array['body']['a'];  //「コンテンツへスキップ」と表示される

上記のコードは正しく動作するのですが、URLを「https://haruoto.com/?reply=407」に変更すると正しく動作しません。
何が原因なんでしょうか?
2020/01/13(月) 21:17:58.61ID:xgMgrp400
HTMLの構造が違うんじゃねーの?

FirefoxなどのブラウザでHTMLのソースを見てみたら?
2020/01/13(月) 21:52:49.01ID:DUDFC3XS0
?reply=407の693〜697行目がコメントの中に--を含む不正な構造なのでsimplexml_load_stringが失敗してるから
681デフォルトの名無しさん (ワッチョイ 7fd4-ErPi)
垢版 |
2020/01/14(火) 00:49:39.13ID:Pp7kDtDs0
>>680
ありがとうございます!
そちらのコメント部分を修正したところ正常に動作するようになりました!
2020/01/14(火) 01:08:34.22ID:HMRlieOS0
PHPのDOMload周りは@でエラー無視が一般的だと思う

$domDocument->loadHTML($html);

@$domDocument->loadHTML($html);

>>678も自分の環境じゃWarning出まくるけどこれで結果を得られるし
?reply=407へURL書き換えたあともちゃんと結果を得られる
自分はPHPのDOM周りはいまいちなんでJavaScript側でやるかな
683デフォルトの名無しさん (ワッチョイ dff1-///2)
垢版 |
2020/01/14(火) 11:21:04.15ID:LsFOQfCc0
自分のサイトを作ることにしました。
目的は主に2つあって、なにか簡単な商売をして副業としてお金をかせぐことと、ブログみたいになにか情報発信しようかと思っています。
PHPも使います。
どこのレンタルサーバを使うのが得策でしょうか?
今後生涯サイトは使おうと思います。
684デフォルトの名無しさん (ワッチョイ 7f59-alJZ)
垢版 |
2020/01/14(火) 14:36:03.43ID:Yv2y+5Q60
ここはまんさんでもやさしくしてくれるやろか

あのな、画像検索するとある画像が大きさが5504x8256ってなってるんやが開くとちっさいんや大きさが指定してあって。アドレスバーのとこに410x618って書いてあって。しかもこいつ実際は274x410なんやで。
wysiwygとかでダメなんやろかってやってもちっさいんや。大きいのは格納されとるハズなんやろうけど初心者すぎて大きい元画像にたどりつけないんやで。

やさしい人手取り足取り教えてほしいんやでどなたか
685デフォルトの名無しさん (ワッチョイ 7f59-alJZ)
垢版 |
2020/01/14(火) 14:36:34.20ID:Yv2y+5Q60
スレチやったらごめんなさい
686683 (ワッチョイ dff1-///2)
垢版 |
2020/01/14(火) 16:42:58.46ID:LsFOQfCc0
どうですかね?
いまの時代、無料のレンタルサーバでPHP/SQLも使えるところはあるのでしょうか?
687デフォルトの名無しさん (ワッチョイ 5fda-woae)
垢版 |
2020/01/14(火) 16:49:46.95ID:HWX79XGs0
>>684
自分のサイトの話じゃなくて、他人のサイトに置いてある画像の元ファイルにどうしたらたどりつけるかって話か
ここは下らねぇ質問のスレだが自分のサイト以外の問題を持ち掛けられてもしょうもないと思います
2020/01/14(火) 16:57:43.19ID:R0T58PMv0
>>683
スレチ
レン鯖スレへ
「いまの時代、”無料のレンタルサーバでPHP/SQLも使えるところ”はあるのでしょうか?」
ダブルクォートのワードそのまんまで検索すればいいのに

>>684
スレチ
google画像検索ならimagesizeのオプション追加すればある程度絞り込めても万能じゃない
サイトまでたどり着けてるならurlを想像してアタックする
2020/01/14(火) 20:36:37.48ID:/BEaD92M0
mysql_real_escape_string($string)
を多用している手続き型のphp5環境からphp7へ移行をしていて、
mysqli_real_escape_string($link, $string)
への修正しているのですが、

htmlspecialcharsのように、エスケープ目的で多用しているコードなのですが、
データベースのリンクも引数の強制になったようですが、リンクを使うのはどういう理由なのでしょうか?

また使いどころとしては、多用せずsqlクエリを使う前に1回で済ますという感じでしょうか?
2020/01/15(水) 00:51:29.73ID:0SK8bZ/o0
>リンクを使うのはどういう理由なのでしょうか?
マニュアルに書いてるけど、
「接続の現在の文字セットを考慮して、SQL 文で使用する文字列の特殊文字をエスケープする」から。
接続が複数あって文字セットが異なる場合なんかを考慮してるのでしょう。

>多用せずsqlクエリを使う前に1回で済ますという感じでしょうか?
プリペアドステートメントで行うのが普通。
mysqliみたいなベンダー固有関数は汎用性がないのであまり使われないよ。
mysqlしか使わないならいいけど、本気で修正するなら手間も同じだしPDOでやったほうがいいと思う。
2020/01/15(水) 01:29:34.93ID:0SK8bZ/o0
>>690の答えはちょっと答えになってなかったから補足しとく

・mysql関数時代も接続(リンク)は必要っちゃ必要だったけど、省略可能な第二引数だった。
 省略した場合は、直近に使った接続になる。
・mysqli関数は省略不可能な第一引数になった。(引数の順番が変わった)

mysql関数は、接続を明示しなくていいので、
接続が複数ある場合、意図しないDBを操作するミスがおきる可能性がある。
エスケープする場合も同様、意図しないエスケープ結果になってしまう恐れがある。
そういうミスを減らすためにも、接続を明示しないといけないmysqli関数ってことなんじゃないかな多分。
2020/01/15(水) 19:33:51.69ID:OZZ+PtiC0
今まで1つの接続しかしたことが無かったので複数を接続するって考えもしなかったです。
たしかにそれだと文字コードが違う場合も想定すると、明示したほうが良いですよね。
古すぎてpdoに書き直すのは難しいので、とりあえず地味に書き換えていきます。

しかしmysqli_real_escape_stringや、mysqli_queryとか
引数の強制が増えたり、引数が入れ替わったり、pdoを使っていない古いコードは修正に振り回されることになりますよね。


プリペアドステートメントは「?」とかコードの行数が一気に増えて難しそうなのですが、
クエリに直接変数を書いて、real_escapeすればと思ってしまうのですがやはりデメリットがあるのでしょうか。
新規で練習するときはプリペアドステートメントを使おうと思っています。
2020/01/16(木) 04:41:59.97ID:WGM+n45y0
>>692
具体的なコードは書かないけど、
real_escape_stringでは攻撃対策としては不十分だから、プリペアドステートメントは必須。
(PDO使う場合、PDO::ATTR_EMULATE_PREPARESが1で、PDO側でエミュレートする場合、攻撃が成立する場合があるのは注意)
型を調べたり、想定してるフォーマットに沿うものか検証(バリデーション)して、
受け渡された変数が安全なデータであることが保証されてればいいけど、それこそコード長くなるし、
プリペアドステートメントでやったほうが、確実だし簡単だと思う。
2020/01/16(木) 09:20:07.39ID:yWLTyI800
>>692
あちこちに適用するライブラリでもなくいろんなDBに対応するわけでもないんだろうから、無理して PDO に置き換える必要は無いんじゃね。
プリペアドステートメントのいいところはプレースホルダが使えることもあるけど、プリペア済みのオブジェクトを何度も使い回すことによってSQLのパースを省略してパフォーマンスを上げられるって利点がある。
でも使い回しなんてせず同じSQLでも使う度にプリペアするようなコードが多いだろうし、バッチならともかくwebの1リクエストでどんだけ使い回せるの?って話もある。

それに加えて LIKE とか可変個の IN とか面倒だから、プリペアドステートメントに拘る必要は無いというのが俺の考えだな。
新規じゃないなら特に。
2020/01/16(木) 14:43:23.92ID:B1/MNbmAM
pdoに置き換えは無理してってほど大袈裟なものじゃないでしょ
手続きが用意されてないからオブジェクトになるけど
オブジェクト型のmysqliと比較してコードは似たりよったりだ
新規はpdoにしたほうがいい
2020/01/16(木) 14:49:59.78ID:7uXyXPAQ0
どこかの機会で書き替えて行けば良いよ
将来はサポートされなくなる訳だし
697デフォルトの名無しさん (ワッチョイ 8d07-muX5)
垢版 |
2020/01/16(木) 16:00:44.94ID:NkO/oANm0
クラス内のメソッドについて、
似たような処理を行うもの(少し変更している)のがあるとします。
たとえば「redirect」というメソッドだったとして、
少し変更したのを「_redirect」みたいにして、親クラスに用意しているのですが
こういう書き方・使い方はまずいでしょうか?
beforeRedirectとかcustomRedirectみたいに変えた方がいいでしょうか?
2020/01/16(木) 16:10:34.16ID:QgmPcxAO0
extendsで新しいクラスにすることと比べると
悩みどころですね
2020/01/16(木) 16:42:45.37ID:7uXyXPAQ0
将来メンテする人にとって無用な負担をかけない方法を選択しよう
使うユーザーができるだけ負担を感じない道を選んだ方がいい
2020/01/16(木) 17:54:13.09ID:WGM+n45y0
>>697
どう変更してるのかわからないけど、
引数の数や型が違うならオーバーロードにする手もある。
ただしPHPにはない機能なので、可変引数を使ったり工夫が必要になるけど。
あとは柔軟に引数でモード選ぶとか、言ってるように名前変えるとかでいいと思う。
701デフォルトの名無しさん (ワッチョイ 8261-s5Rz)
垢版 |
2020/01/16(木) 18:12:11.14ID:9x78fuLW0
共通部分の処理は親側で全部行うようにして、差分だけを子側に委譲する(abstractメソッド)。
2020/01/16(木) 20:22:40.39ID:HZuE80s1a
>>693-694
今回は古い部分を直すだけで必死なのでreal_escapeを使いますが、
たしかにプリペアドステートメントが
エスケープも兼ねるので新規では使いたいです。

古いコードなので、闇雲に同じクエリを投げているので、そういう意味ではプリペアドステートメントの利点を受けられるかもしれません
2020/01/17(金) 17:10:14.42ID:HDLfgQuO0
>>699-700
できれば他の人が見てもわかる方法にしたいのですが、

親クラス
class Main {
 function redirect($url){
  header('Location:' . $url);
 }

 function _redirect($url){
  〜$urlになにかする処理〜
  $this->redirect($url);
 }
}

みたいなことをしていまして、これだとわかりづらいですよね?
※redirectになにかする処理を書くのは別とします。

なので別のメソッド名にした方がいいのかな?と思うものの、
beforeRedirectとかcustomRedirectとかにするのは変かな?
と感じており、質問した次第です。
2020/01/17(金) 18:45:49.52ID:vvJW2PiAM
コールバックでいいんじゃ
2020/01/17(金) 22:12:48.18ID:9k6vGiaj0
>>703
API見て使い方が理解出来ん
クラス利用者はredirectと_redirectのどっちをコールする想定なんだ?

あとbeforeRedirectは名前的にイベントハンドラっぽく思える
2020/01/20(月) 10:56:16.47ID:UzBq59x80
>>705
通常はredirectの方で、変わったことがしたい(ページ推移を分岐させたい等)時は
_redirectの方を使うというイメージです。

そのため、「このリダイレクトは、カスタマイズしたリダイレクトですよ」
ということを説明するためのメソッドであればと思うのですが、
「_redirect」のような名前は、間違いやすいし、
beforeRedirectの場合はイベントハンドラっぽいので、悩んでいる次第です。
2020/01/20(月) 11:28:18.41ID:UzBq59x80
すみません、自己レスですがやっぱり変なので

class Main {
 function beforeRedirect($url){
  〜$urlになにかする処理〜
  return $url;
 }

 function redirect($url){
  $url = $this->beforeRedirect($url);
  header('Location:' . $url);
 }
}

みたいな設計にし直します。
2020/01/20(月) 19:21:08.15ID:OvG49n5/0
ネーミングの問題だと思うけど、アンダーバーが付いたのは予約語だったりシステムコールに
見えちゃうので、ちゃんと名前付けた方がいいね
個人的には面倒くさかったら拡張した方はすべて〜exで済ませる
2020/01/21(火) 22:14:23.82ID:k/0CqDEqa
editURL/editRedirectURLとか
あとはめっちゃ冗長だけどeditURLBeforeRedirectとかな

そもそもredirectと並列に並べるような処理してないんだから同じ動詞が中心になるような命名はダメ
2020/01/26(日) 21:35:09.22ID:X84CwPm80
formのactionを「action=""」と記述した場合、再帰的に現在のページが呼び出されると
あったのですが、その際は現在のページの記述を全て読み込みなおすってことでしょうか?
2020/01/26(日) 22:32:40.52ID:a2Fj97SM0
>>710
ある意味そうだよ。当然、新規にページが読み込まれる。
「再帰的に」っていうのはよくわからないが。
2020/01/26(日) 22:34:05.94ID:qUKNFCzW0
>>710
遷移先のURLが今と同じになるということ。
submitされる内容はその時のformの中身だから、ページの内容を読み込み直すということではない。
よくあるフォームだと、入力、確認、完了画面を順に遷移していくと思うけど、それら全部を同じ myform.php というひとつの URL で対応する感じ。
今どの画面を表示すべきなのかは submitされるパラメータのどれかに仕込むとかして判別できるようにする。

method が get だと URL自体が変化していくから、その手法をやるなら method は必然的に post になる。
2020/01/26(日) 23:01:03.81ID:X84CwPm80
>>711-712
即レスどうもです。

動画サイトで勉強してまして、なんでその記述になるのか説明がないので、
>>712さんの説明で理解が深まりました。


遷移先が同じ場合はformのパラメータのみが変化して、ページの記述は読み直さないってこと
なのでしょうか?

下記のようにPOSTされていたら関数を呼び出すという条件式がheadタグより
上に書いてあり、ページの記述を読み直しでもしないと
この条件式の処理が走りようがないのでは?と混乱しております。

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
 $uploader->upload();
}
2020/01/26(日) 23:24:50.30ID:9P93xbrg0
GETだとブラウザのキャッシュが使われる可能性もあるが
POSTなら確実に再度リクエストが来る
2020/01/26(日) 23:31:40.69ID:qUKNFCzW0
>>713
それは同じURLで get と post の両方に対応してるんだね。
リンク踏んだりURL叩いてページに来たときは get でのアクセスになるから、とりあえず動画閲覧画面でも表示するのでしょう。
でもその画面では動画のアップロードもできるようになってて、post によってアクセスされる場合はアップロードの操作がされたものとして動画を差し換え、改めて閲覧画面を表示するのでしょう。
ページの記述とか何言ってるのかはよくわからないけど、その URL はアクセスされる度に毎回一からページを送り出してるだけだと思うよ。
動画のIDなんかURL自体に含まれてて、閲覧や更新対象を示すキーとして満ち足りてるから、同じURLを使い回すようにしてるんじゃないかな。
ブックマークするときなんかも、リンク踏んで来た場合でもアップロード後でも URL が一緒になるからタイミングを選ばず都合がいいだろうしね。
2020/01/27(月) 19:31:57.14ID:5Ks+WgqK0
なんかHTTPの基礎がわかってなさそう
717デフォルトの名無しさん (ワッチョイ f689-Kz18)
垢版 |
2020/01/30(木) 15:15:02.21ID:H+L/BkWr0
phpでPixivの画像まとめてDLしたいなと思いついて
https://html-css-javascript.com/demo/pixiv/
これ参考にやってるんだけどうまく行かない
Pixivの画像ってphpじゃDLできないの?
2020/01/30(木) 15:50:27.29ID:smyD86f50
phpじゃ厳しいなあ
rubyなら簡単にできるんだけどね
2020/01/30(木) 17:42:05.62ID:vZSmPHC30
>>717
それ少なくともおととしのpixivのUIが糞化する前用のやつだから
720デフォルトの名無しさん (ワッチョイ f689-Kz18)
垢版 |
2020/01/30(木) 18:08:28.77ID:H+L/BkWr0
マジか…
Rubyわかんないからphpでやりたかった

Pixivの画像のURL自体は変わってなかったから下記のURLの画像が保存できる方法知ってたら教えて下さい
https://i.pximg.net/img-original/img/2020/01/28/01/28/46/79136582_p0.png
2020/01/30(木) 20:01:18.05ID:OBUYa7FA0
718にrubyで書いてもらって、PHPに移植すれば良いんでね?
2020/01/30(木) 20:29:52.18ID:N/97jNZ60
>>720
リファラーつければいいだけ

curl 'https://i.pximg.net/img-original/img/2020/01/28/01/28/46/79136582_p[0-16].png' -H 'Referer: https://www.pixiv.net/en/artworks/'

rubyでも簡単だけどajax不要でログイン不要なら
curlとか使ってシェルスクリプト書いたほうが簡単
2020/01/30(木) 20:52:22.46ID:N/97jNZ60
ranking TOP10のやつ全部ダウンロードするスクリプト
curl, pup, jqが必要

curl -s 'https://www.pixiv.net/ranking.php' ¥
| pup 'a.work' attr{href} ¥
| head -10 ¥
| sed -E 's/¥/artworks¥/([0-9]+)/¥1/' ¥
| xargs -I {} curl -s https://www.pixiv.net/ajax/illust/{}/pages ¥
| jq '.body[].urls.original' ¥
| xargs -I {} curl -# {} -H 'Referer: https://www.pixiv.net/en/artworks/' -O -w "%{url_effective}¥n"
2020/01/30(木) 20:54:05.78ID:N/97jNZ60
円マークはバックスラッシュに変換して
725デフォルトの名無しさん (ワッチョイ a5f1-yzQx)
垢版 |
2020/01/30(木) 20:58:51.80ID:Rpk6h2gy0
>>724
なぜ?
円マークとバックスラッシュは同じじゃないの?日本語のパソコンだと円マークに表示されるだけで。

この辺の仕組みを「文字コード」とてう言葉を使って竹を割ったようなスッキリ解説できるかた、どうかお願いできませんかね?
726デフォルトの名無しさん (ワッチョイ b501-0Ybi)
垢版 |
2020/01/30(木) 21:01:33.81ID:Z7o7STkD0
フォントデザインが違うだけ。
2020/01/30(木) 21:30:24.16ID:N/97jNZ60
>>725
円マークとして表示されてる文字の文字コードが
バックスラッシュと同じ0x5Cならいいんだけど
>>723の円マークは0xA5なので別の文字

バックスラッシュと円マークは同じ場合もあれば
違う場合もあるってこと
728デフォルトの名無しさん (ワッチョイ f689-Kz18)
垢版 |
2020/01/30(木) 21:56:00.67ID:H+L/BkWr0
N/97jNZ60 様
ありがとうございます。
ですが、素人に毛が生えた程度の私では難しいようです。(Rubyもスクリプトもできません)
phpで無理そうなら諦めます。
2020/01/30(木) 23:11:34.50ID:N/97jNZ60
>>728
PHPでもシェルスクリプトより少し面倒なだけで普通にできるよ
処理手順だけ書いておくからPHPでトライしてみて

https://www.pixiv.net/en/artworks/79136582の一連の画像を全部ダウンロードしたい場合

https://www.pixiv.net/ajax/illust/79136582/pagesにアクセスすれば
各サイズのURLのリストがJSON形式で取得できる

取得したURLリスト(JSON)から目的のURLだけ抜き出して
そのURLを一つずつアクセスして画像をファイルに保存すればOK

>>723の後半3行が上の手順に相当する部分
2020/01/30(木) 23:12:03.35ID:OBUYa7FA0
>>728
書いて頂いたスクリプトはPHPではないですがRubyでもないですよ
このスレで解説してもらえるかは分かりませんが
じっくり噛んで飲みこんでいけば消化可能です

がんばれ!
2020/01/31(金) 04:16:30.86ID:Qzj9ULR80
>>729の仕様がわかれば根こそぎダウンロード出来るな
適当なsleep値挟まないと岡崎図書館になりそうでおそろしいw
2020/01/31(金) 04:23:23.85ID:1Ft64C3q0
普通にAPI公開してるんだけど
2020/01/31(金) 04:49:35.34ID:/fagGTpB0
>>723
は、Linux コマンド、またはシェルスクリプト

一方、Windows 10 にも、curl が入っている。
コマンドプロンプトで、where curl と打つと、
C:\Windows\System32\curl.exe

このcurl とは別に、PowerShell にもcurl がある

Ruby で、`〜` 内に、コマンドを書いて、呼び出すこともできる。
例えば、curl のヘルプの最初の5行を表示する

puts `curl -help`.lines.first( 5 )

同様に、PHP にも、コマンドを呼び出す記法があるはず。
ダウンロードでは、Linux のcurl, wget は、よく使うコマンド

Windows 10 上で, WSL, Ubuntu 18.04 を使っているなら、
Linux側で、Linuxコマンド・シェルスクリプトを書いて、Windows側のフォルダをいじる事もできる
2020/01/31(金) 08:14:28.08ID:/fagGTpB0
Ruby なら、ウェブページをBOMなしUTF-8 で、一旦保存してから、JSON.parse すると、

require 'open-uri'
require 'json'

# json_str = URI( "https://www.pixiv.net/ajax/illust/79136582/pages"; ).read
json_str = File.read( "79136582_pages.json" ) # 保存した、UTF-8 ファイル

json_obj = JSON.parse( json_str )
json_obj[ "body" ].each do |urls|
p urls[ "urls" ]
end

出力。
こういうのが画像の数だけあるけど、この中で、original だけが欲しいの?

{"thumb_mini"=>"https://i.pximg.net/c/128x128/img-master/img/2020/01/28/01/28/46/79136582_p0_square1200.jpg";,
"small"=>"https://i.pximg.net/c/540x540_70/img-master/img/2020/01/28/01/28/46/79136582_p0_master1200.jpg";,
"regular"=>"https://i.pximg.net/img-master/img/2020/01/28/01/28/46/79136582_p0_master1200.jpg";,
"original"=>"https://i.pximg.net/img-original/img/2020/01/28/01/28/46/79136582_p0.png";}
2020/01/31(金) 09:07:20.03ID:Qzj9ULR80
PHPで頼む言われてんのにRuby厨また沸いてんのかw

$api = 'https://www.pixiv.net/ajax/illust/79136582/pages';
$json = json_decode(file_get_contents($api));
$ctx = stream_context_create(['http'=>['header'=>"Referer: {$api}\r\n"]]);
foreach ($json->body as $body) {
  $url = $body->urls->original;
  $fname = basename($url);
  file_put_contents($fname, file_get_contents($url, false, $ctx));
  sleep(1);
}

保存先やら上書きやら考慮してないからこのままは使うなよ
736デフォルトの名無しさん (ワッチョイ f689-Kz18)
垢版 |
2020/01/31(金) 10:18:31.72ID:2wi/3AbP0
昨日Pixivの件で質問した者です。
皆様のおかげでなんとかできました。
ありがとうございます。
ただ、>>735 さんのようにきれいに書けてないので修正しながら使っていきたいです。
2020/01/31(金) 10:29:10.97ID:k4NtdgGW0
頑張れよ!
738デフォルトの名無しさん (ワッチョイ f689-Kz18)
垢版 |
2020/01/31(金) 17:24:53.23ID:2wi/3AbP0
Pixivの質問者です。
画像をタイトル名で保存したかったので、下記のようにしました。

$url = "https://www.pixiv.net/artworks/79152593";;
$html = file_get_contents($url);
preg_match("/この作品 「(.*)」 は 「/", $html, $titlearr);
echo $title = $titlearr[1];

タイトル以外にも投稿日や閲覧数などが取得できたのですが、カテゴリが上手く取得できません。
なにか良い方法はないでしょうか?

もしくは「https://www.pixiv.net/ajax/illust/79152593/pages」のような画像の情報集のようなものがあるのでしょうか?
2020/01/31(金) 19:10:54.05ID:Qzj9ULR80
DOMDocumentで$htmlをロードして
getElementById('meta-preload-data')->getAttribute('content')取って
json_decodeすればあとはapiと同じ様につかえるんじゃね?
文字コードまわりの処理がちょっと面倒だと思うが
2020/01/31(金) 19:41:52.91ID:sTuegRNa0
作品情報のAPIはこれ
https://www.pixiv.net/ajax/illust/79152593
741デフォルトの名無しさん (ワッチョイ f689-Kz18)
垢版 |
2020/01/31(金) 20:23:09.76ID:2wi/3AbP0
ありがとうございます。
JSONならなんとかなりそうです。
「/pages」を取るだけだったんですね…
2020/01/31(金) 23:34:14.10ID:/fagGTpB0
>>732
に、API を公開してるって、誰かが書いてる

大々的に横断検索のようなスクレイピングしてると、営業妨害で逮捕される!
ちゃんと会社と契約して、API を使ってやるように!

会社のrobots.txt で、スクレイピングを禁止している場合は、有罪にされる!
クローラーの開発者は、robots.txtに従うべき!
従わないと訴えてくる。特に、5ch みたいなサイトは

クローラーのテストも、自分のPC 内に、Rubyのサーバーを立てて、
そこにウェブサイトのコピーを作って、それにアクセスしてテストする

本当のサイトに対して、テストしたりしない!
何回もテストしていると、営業妨害になるから!

クローラー開発者の大原則!
1. 会社と契約して、API を使う
2. robots.txtに従う
3. 自分のPC内に、サーバーを立ててテストする

それと書き込むときは、名前欄に、717 と入れてください!
誰が書き込んでいるか、分からないので
2020/01/31(金) 23:59:16.23ID:k4NtdgGW0
一般のブラウザと同程度の頻度でアクセスしている分には
サイト側で区別するのは困難だろうし、
訴えられる事も無いんじゃないかな、知らんけど
2020/02/01(土) 00:45:19.00ID:EnxAFhi/0
>>742
>大々的に横断検索のようなスクレイピングしてると、営業妨害で逮捕される!
>会社のrobots.txt で、スクレイピングを禁止している場合は、有罪にされる!
>何回もテストしていると、営業妨害になるから!

すべてデマ
一般論としてデマ書くくらいは別にいいけど
それを元に人を犯罪者扱いするとそれこそ罪になるから気をつけてね
745デフォルトの名無しさん (ワッチョイ b501-/fp1)
垢版 |
2020/02/01(土) 00:47:42.04ID:1yCARK9i0
だからAPI公開されてるんだってば
2020/02/01(土) 00:50:08.53ID:MgOexLzI0
専用ブラウザだろうが一般ブラウザだろうが、使う人間が同じなら同程度のアクセスにしかならんと思う
あと、API使わないWEB通信で専用か一般かを判別するのは無理じゃね?
UAも偽装できるし、そもそも廃止方向だし
2020/02/01(土) 01:00:56.04ID:4wtj58110
いたずら電話でも、回数が多いと逮捕される!
一杯逮捕されてるし、有罪にもなってる!

会社は、一般的な用法でアクセスできるようにしてるだけで、
常識内の使い方じゃないと、営業妨害になる

クローラー開発者が、robots.txt に従うのは常識だから、従わないと営業妨害になる。
クローラー開発者はそもそも一般人じゃないし、一般的な使い方じゃない

株取引と同じで、プロの取引だから、守るべきハードルが高い。
これほど専門的な開発者は、素人の一般人が作っていましたという弁明ができない。
専門家として扱われるから
2020/02/01(土) 01:09:26.21ID:MgOexLzI0
>>747
誰にレスしてるのか分からないけど、俺にレスしてるんなら改めて書いとく

俺は良い悪いの話をしていない
API非使用の話
同じ人間がスレ見るような使い方はアクセス頻度も負荷も変わらないだろう
判別するのは技術的に無理じゃねえか

以上
弁明とかそんな次元の話をしているのではないので、そこんとこよろしく
2020/02/01(土) 01:22:55.39ID:yTeildyw0
robots.txtの記述に従わないと行けない法的根拠はないんだが
あくまでも、マナーやエチケットのレベル
2020/02/01(土) 02:39:22.43ID:4wtj58110
法律では、常識というのが判断基準になる

マナー・エチケットなどは関係ない。
契約していない者同士では、有形力の行使が判断基準

API の契約をした場合は、契約者同士だから、刑事事件にならないけど、
契約をしていない場合は、有形力の行使で判断する

いたずら電話とか、万引き・痴漢・家宅侵入などは、
契約していない者同士での有形力の行使

一般的じゃない使い方は、非常識になる。
プログラミングなど、プロの技術を用いた場合は、一般人と違う扱いになる

一般人が手でクリックした場合と、違う扱いになる

マナー・エチケットも、プロ・素人では、遵守レベルが異なる。
一般人の遵守レベルと、プロの遵守レベルは違う

株取引と同じ。
株はプロの遵守レベルだから、1桁間違って入力しても、勘違いとして撤回できないだろ。
普通の民法なら、錯誤で撤回できるけど

株は一般人の商取引じゃなく、プロの商取引だから、遵守レベルが厳しい
2020/02/01(土) 03:15:22.90ID:r8UutYKJa
botガイル
2020/02/01(土) 05:09:00.85ID:IZAG69wa0
それ有名なrubyキチだから相手にするだけ時間の無駄やで
2020/02/01(土) 11:30:39.83ID:ldPcUcvt0
pixivとか大きいところならインフラで帯域制御してるだろうから、IP詐称やら多数の接続元やらで大規模にやらない限り、
スクリプトでのDLは気付かないだろうし看過されるだろうけどね
逆に目立てば注意とか何も言われず制限とかされる

まあ、インターネットがある意味良識で成り立ってるところもあるから、あまり変なことはしない方がいいよ
自分のことばかり考えるなってね
754デフォルトの名無しさん (ワッチョイ b501-+mJQ)
垢版 |
2020/02/02(日) 11:44:23.24ID:OTJ5GLO00
サイト内検索を設置したいのですがわかりません 
どのように作ればよいのでしょうか?
2020/02/02(日) 11:54:17.96ID:lNG3EL+m0
サイト内の何を検索したいのかを言わないと
2020/02/02(日) 12:50:13.69ID:ceem9FS20
サイト内検索は、Google を使えば?
「site:URL 検索したい文字列」だろ

このコントロールを、はめ込めば良いのでは?
757デフォルトの名無しさん (ワッチョイ a602-ZjM+)
垢版 |
2020/02/03(月) 04:24:06.78ID:w78j2Hgc0
サイト内のキーワードを検索したいんです
絞り込み検索など
2020/02/03(月) 04:30:12.91ID:YoBHNt100
多くのサイトが、Google のコントロールを使っているから、

Googleが配布しているのでは?
759デフォルトの名無しさん (ワッチョイ 3d7c-a4zy)
垢版 |
2020/02/03(月) 21:07:08.59ID:zKdzrXwz0
平面上に座標の判明している点が数百あるとして、全ての点どうしの距離を
計算時間はかかって構わないのでハングしないように計算したいのですが
PHPではどうやったらいいのでしょうか

普通のPHPプログラムと同じように
点の座標情報をリクエストとして受け取って
全ての計算が終わったらブラウザにレスポンスしたいです
2020/02/03(月) 21:21:55.23ID:7cu/pWw8r
普通に2重for文で愚直に計算すればいいんじゃねーの
数百程度なら一瞬でしょ
2020/02/04(火) 09:19:02.42ID:6/2RTZHA0
Ruby なら、標準のwebrick サーバーで、
VSCode の拡張機能、REST Client で、JSON 文字列をPOST すると、同じ配列が返ってくる。
CGI にも出来る

POST http://localhost:8888/ HTTP/1.1
content-type: application/json

[[0,0],[10,20],[10,10]]

以下は、Ruby

require 'webrick'
require 'json'

srv = WEBrick::HTTPServer.new( {
:DocumentRoot => './',
:BindAddress => '127.0.0.1', :Port => 8888 } )

srv.mount_proc( '/' ) do |req, res|
res[ "content-type" ] = "text/plain"

ary = JSON.parse( req.body ) # JSON 文字列から、Ruby のオブジェクトに変換する
# ここで、ary を処理する
result = JSON.generate( ary ) # Ruby のオブジェクトから、JSON 文字列に変換する

res.body = result
end

Signal.trap( :INT ){ srv.shutdown } # Ctrl+C で終了
srv.start
2020/02/04(火) 10:26:16.95ID:a9RPAFSb0
>>759
長い計算で問題になるのはタイムアウトと使用人数
色々考慮しないといけないのでケースバイケースになるが
そういう計算はJavaScriptでやったほうがいいと思う
非力な環境考慮やスマホの節電狙ってるならとめはしないが

基本はある程度計算した時点で(タイムアウトする前に)一度レスポンス返して
計算再開するようリクエスト再送して計算終わるまでそれを繰り返すとか
サーバ側でタイムアウトを無効にしてマルチスレッドで計算しながら
Transfer-Encoding: chunked(flush関数)とかでなんかブラウザに送り続けるとかそんなところ
あと設定したことないので確認はしてないがxhr使えばブラウザ側のタイムアウトは無効に出来るはず
大人数で使う&計算が数時間に渡る場合サーバ側タイムアウトを無効にするような計算はしないほうがいい
2020/02/04(火) 10:59:31.95ID:6/2RTZHA0
確かに、計算のタイムアウトなどを考えたら、

AWS Lambda などを使った方がよい
764759 (ワッチョイ 3d7c-a4zy)
垢版 |
2020/02/04(火) 14:13:53.25ID:D53RXKif0
>>760
450点あたりで
計算は10万回超えちゃいそうな気がするんですが…

>>762
あざます、そんで説明下手ですみません
アクセス数とか、ユーザビリティ的なことはそれほど考えなくていいんです

説明が難しいんですが、MovableTypeみたいな動き方と言いますか
このプログラムを一度実行することで静的なファイルを生成して
ウェブのユーザにはそのファイルを見てもらうことになるので

なのでとりあえず、10万なら10万回
時間かけていいんで、PHPがハングしないように計算を終えて
その結果が出たら、ブラウザに返したいな、と

昨夜自分で考えて
PHPは1点ずつの計算結果をテキストファイルとして生成して
ブラウザはそのファイルが出来ているか定期的にポーリングする
みたいなことを考えたんですが…
2020/02/04(火) 14:21:15.46ID:gHL4c7Fjr
じゃあ高速フーリエ変換でもすれば
2020/02/04(火) 15:04:39.24ID:lLuVC2X20
それがサーバー上にあって、割と自由にいじれるなら
バッチ処理で結果を出して表示にしたら良いんじゃないかな
767759 (ワッチョイ 3d7c-a4zy)
垢版 |
2020/02/04(火) 16:28:58.13ID:D53RXKif0
>>766
点の情報は、ブラウザからJSONかCSVかXLSXかでポストさせるので
実行時点で数が不明ですので、クロンを書くのも難しいかなと

たぶんポストされた座標データ群を基に

foreach($datas as $data){
foreach($datas as $data){
// ここで距離を計算
// 計算済みのものは除外
}
}

みたいになるわけですが、$datasの数が多いと止まってしまうので
非同期でいいので止まらない方法はないものかなと
2020/02/04(火) 17:30:21.86ID:26FK/H9g0
数百の点同士だから最大1000 x 1000でも100万でしょ
floatだとしても100msもかからないと思うんだけどそれでハングするの?

クライアント側で計算させても一瞬だから
ラウンドトリップさせるのをやめて計算結果だけ非同期で受け取るようにしたほうが
ユーザーにとっても運用してる側にとってもいいと思う
769759 (ワッチョイ 3d7c-a4zy)
垢版 |
2020/02/04(火) 17:37:32.11ID:D53RXKif0
>>768
あざます
大丈夫ですかね?100万回
とりあえずストレートにやってみようかなあ…
2020/02/04(火) 23:05:49.06ID:6/2RTZHA0
JSON が普通。
非同期処理なら、Ajax を使う方法もある

C/C++ で計算だけして、ファイルに書き込んでから、
ウェブサーバーで、そのファイルを見れば?

計算速度が遅くてもよいなら、どの言語でも良いし
2020/02/04(火) 23:14:48.03ID:lLuVC2X20
実際の処理時間次第って気がする
10分程度なら、そのまま終わるのを画面監視して待っていれば良い
数時間以上掛かるなら、結果をメールで送ってもらうなり
夜間バッチで動かしておくのも良いかも
■ このスレッドは過去ログ倉庫に格納されています