DEV Community

Hajime
Hajime

Posted on

配信先7社の入力制約をJSONにして、原稿を投稿前に検査する

配信先7社の入力制約をJSONにして、原稿を投稿前に検査する

プレスリリースを複数の配信サービスに出していると、フォームを開いてから「文字数が足りない」「画像が1枚足りない」で止まります。7社それぞれ制約が違うので、毎回そこで時間を使っていました。

そこで制約をデータにして、投稿前に原稿を検査するようにしました。この記事はその作り方と、実際に7社のフォームを取得して集めた制約値です(2026年8月実測)。

制約をデータにする

サービスごとの制約を1つのJSONにまとめます。コードに条件を書き散らさず、データとして持つのが要点です。

{
  "prerele":  { "body_min": 250, "images": 1, "phone": false, "address": false },
  "prfree":   { "service_max": 10, "title_max": 30, "body_min": 300, "html": false,
                "images": 1, "image_min_width": 600, "image_max_mb": 2 },
  "pressnow": { "sections_max": 5, "section_max": 2000, "images": 1, "phone": true,
                "extra_fields": ["subtitle", "lead", "legal_name"] },
  "directpress": { "title_max": 50, "lead_max": 300, "body_max": 3000,
                   "public_contact_max": 500, "phone": true, "https": false },
  "tsunagugu": { "title_max": 40, "lead_min": 50, "lead_max": 200, "body_min": 300,
                 "headings_max": 3, "heading_max": 40, "images": 2, "phone": true }
}
Enter fullscreen mode Exit fullscreen mode

body_minbody_max両方あるのがこの領域の面倒なところで、DirectPress! だけ上限、他は下限です。

検査する

原稿から本文・タイトル・画像枚数を取り出して、各サービスの条件に当てはめます。

# 例: 本文の文字数を数える(HTMLタグを除いた実文字数)
body_len=$(sed 's/<[^>]*>//g' draft.html | tr -d '[:space:]' | wc -m)

jq -r --argjson n "$body_len" '
  to_entries[]
  | select((.value.body_min // 0) > $n or (.value.body_max // 1e9) < $n)
  | "\(.key): 本文 \($n)字 は範囲外 (min=\(.value.body_min // "-") max=\(.value.body_max // "-"))"
' limits.json
Enter fullscreen mode Exit fullscreen mode

これを投稿前に流すだけで、フォームで止まることがほぼ無くなりました。

集めた制約値

以下は各社のフォームを実際に取得して確認した値です。

Zero Press

Zero Press

登録料・配信料・掲載料がすべて0円で、大手メディア20社への告知もこの範囲に入ります。掲載されたリリースは、タレントや芸人のSNSで拡散されることがあります。

この記事の趣旨で言うと、検査すべき制約が少ないのが特徴でした。以降で見ていくとおり、他社は文字数の上下限や必須項目に加えて「掲載後にやること」まで条件に含みます。そこは原稿の検査では拾えません。

制約の少ない無料プレスリリース配信ならZeroPress

ぷれりり

ぷれりり

body_min: 250 / 画像1枚 / 住所・電話ともに不要。会員登録も不要です。審査は最短5分・通過率95%と案内されており、投稿した当日に掲載されました。

データに入れておくべきなのは修正不可というフラグです。公開後の修正・削除ができないため、検査を通す優先度が他社より高くなります。掲載記事の本文リンク5本は rel 属性なしで dofollow でした。

PR FREE

PR FREE

制約が最も細かい部類です。サービス名10字、タイトル30字、本文300字以上、HTMLは使用不可、画像は横600px以上・2MBまでを1枚。

html: false は検査項目として重要で、他社向けに作ったHTML入りの原稿をそのまま渡すと崩れます。プレーンテキスト版を別に生成する分岐が要ります。

投稿数に上限はなく当日に掲載されましたが、サイトURL欄は rel="nofollow external noopener ugc"、本文中のURLはリンク化されずテキスト表示でした。

FREE PRESS RELEASE

FREE PRESS RELEASE

文字数より値の形式が問われます。電話番号はハイフン必須、連絡先はURL形式でメールアドレス不可、担当者名は実名でニックネーム・部署名は不可。

つまり検査は正規表現の仕事になります。

grep -qE '^0[0-9]{1,4}-[0-9]{1,4}-[0-9]{3,4}$' <<<"$phone" || echo 'phone: ハイフン必須'
Enter fullscreen mode Exit fullscreen mode

入口にGoogleアカウントでのログインが必須である点も、運用側の前提として持っておく必要があります。審査は最短1時間〜7営業日、リンクは dofollow でした。

PRESSNOW

PRESSNOW

他社に無い項目が3つあります。サブタイトル、リード文、正式社名。原稿のデータ構造にこの3つが無いと、ここだけ手作業になります。

本文は見出し+本文のセクションを最大5つ、各2,000字まで。検査はセクション単位で回す必要があります。

そして原稿の検査では拾えない条件があります。掲載後3営業日以内に自社サイトへPRESSNOWの紹介ページを設置し、URLを編集部へ返信すること。SNS・無料ブログ・短縮URLでは要件を満たしません。審査は1時間から3営業日。追加URLは最大5本置けるものの実測では原則 nofollow で、公開後の修正・削除も原則できません。

DirectPress!

DirectPress!

唯一 body_max を持つサービスです。本文3,000字以内、タイトル50字以内、概要リード文300字以内。他社の下限に合わせて長く書いた原稿は、ここで削ることになります。

public_contact_max: 500 の公開連絡先はそのまま公開され、記載が不明確だと掲載されません。URL欄は任意です。掲載は1日2〜8件、掲載日時は選べません。

技術的には https: false をデータに持たせておくのが実務的でした。httpのみでhttps非対応なので、URLを組み立てる処理でスキームを決め打ちにしていると落ちます。

ツナググ

ツナググ

images: 2 が効きます。画像2枚が必須なのは7社でここだけなので、1枚しか用意していないと止まります。

冒頭文が lead_min: 50 / lead_max: 200 と上下限の両方を持つのも特徴です。タイトル40字以内、本文300字以上、見出しは40字×最大3。

運用条件も重く、2026年2月17日適用の利用条件で、配信後に記事URLを自社サイトやSNSで告知し、告知先を指定フォームへ報告する義務があります。報告がない場合は1記事あたり10,000円+税と明記されています。掲載後の修正が1,000円、掲載6ヶ月未満での削除が1,000円。無料で出せるのは月5配信までで、6本目からは1万円。住所と電話番号は公開されます。リンクは rel="noopener noreferrer" のみが付き、dofollow でした。掲載までは数日かかっています。

まとめ

制約をデータにして分かったことです。

  • 下限と上限が混在する。 DirectPress! だけ本文が上限で、他は下限
  • 枚数が違う。 ツナググだけ画像2枚
  • 形式の検査が要る項目がある。 電話番号のハイフン、連絡先のURL形式
  • 他社に無い項目がある。 PRESSNOW のサブタイトル・リード文・正式社名
  • 原稿の検査では拾えない条件がある。 掲載後の作業義務は別に管理する

最後の1点だけはデータに入れても検査になりません。掲載後に何かを要求するサービスかどうかは、採用を決める段階で分けておくのが結局いちばん早いです。

本ページはプロモーションが含まれています

Top comments (0)