[{"data":1,"prerenderedAt":1506},["ShallowReactive",2],{"tech-auto-post-ke-website":3},{"id":4,"title":5,"author":6,"body":7,"category":1490,"date":1491,"description":1492,"extension":1493,"image":1494,"meta":1495,"navigation":417,"path":1496,"readingTime":1497,"seo":1498,"stem":1499,"tags":1500,"__hash__":1505},"tech\u002Ftech\u002Fauto-post-ke-website.md","Auto-Post ke Website dengan OpenClaw — Content Publishing Otomatis","Zainul Fanani",{"type":8,"value":9,"toc":1463},"minimark",[10,30,35,38,43,46,59,62,66,81,85,99,103,114,118,123,150,154,301,305,371,375,382,1036,1040,1104,1109,1115,1119,1124,1168,1172,1209,1215,1219,1223,1226,1255,1259,1262,1287,1291,1294,1313,1317,1343,1347,1351,1385,1389,1398,1402,1410,1414,1417,1431,1436,1450,1453,1459],[11,12,13],"blockquote",{},[14,15,16,17,21,22,29],"p",{},"📎 ",[18,19,20],"strong",{},"Source:"," ",[23,24,28],"a",{"href":25,"rel":26},"https:\u002F\u002Fgithub.com\u002Ffanani-radian\u002Fopenclaw-sumopod",[27],"nofollow","openclaw-sumopod"," — view on GitHub & star ⭐",[31,32,34],"h1",{"id":33},"auto-post-to-website-from-images","Auto-Post to Website from Images",[14,36,37],{},"Transform photos into polished website posts automatically using OpenClaw.",[39,40,42],"h2",{"id":41},"overview","Overview",[14,44,45],{},"This tutorial shows how to build an automated content pipeline that:",[47,48,49,53,56],"ol",{},[50,51,52],"li",{},"Takes an image input (product photo, project update, etc.)",[50,54,55],{},"Generates bilingual content (Indonesian + English) using AI",[50,57,58],{},"Posts directly to your website via API",[14,60,61],{},"Perfect for: Company updates, product showcases, project documentation, portfolio entries.",[39,63,65],{"id":64},"what-youll-learn","What You'll Learn",[67,68,69,72,75,78],"ul",{},[50,70,71],{},"Image-to-content generation workflow",[50,73,74],{},"Bilingual content creation (ID\u002FEN)",[50,76,77],{},"API integration for automated posting",[50,79,80],{},"Multi-company\u002Ftenant support",[39,82,84],{"id":83},"prerequisites","Prerequisites",[67,86,87,90,93,96],{},[50,88,89],{},"OpenClaw installed",[50,91,92],{},"Website with API endpoint (POST \u002Fapi\u002Fposts)",[50,94,95],{},"API authentication (JWT\u002Fbearer token)",[50,97,98],{},"Image source (uploaded file or URL)",[39,100,102],{"id":101},"architecture","Architecture",[104,105,110],"pre",{"className":106,"code":108,"language":109},[107],"language-text","[User sends photo]\n        ↓\n[OpenClaw receives image]\n        ↓\n[AI generates content]\n  - Title (ID & EN)\n  - Description (ID & EN)\n  - Caption (ID & EN)\n  - Tags\u002Fcategories\n        ↓\n[POST to website API]\n        ↓\n[Website publishes post]\n        ↓\n[Confirmation sent to user]\n","text",[111,112,108],"code",{"__ignoreMap":113},"",[39,115,117],{"id":116},"step-1-prepare-your-website-api","Step 1: Prepare Your Website API",[119,120,122],"h3",{"id":121},"required-api-endpoint","Required API Endpoint",[104,124,128],{"className":125,"code":126,"language":127,"meta":113,"style":113},"language-http shiki shiki-themes github-light github-dark","POST \u002Fapi\u002Fposts\nContent-Type: application\u002Fjson\nAuthorization: Bearer YOUR_TOKEN\n","http",[111,129,130,138,144],{"__ignoreMap":113},[131,132,135],"span",{"class":133,"line":134},"line",1,[131,136,137],{},"POST \u002Fapi\u002Fposts\n",[131,139,141],{"class":133,"line":140},2,[131,142,143],{},"Content-Type: application\u002Fjson\n",[131,145,147],{"class":133,"line":146},3,[131,148,149],{},"Authorization: Bearer YOUR_TOKEN\n",[119,151,153],{"id":152},"request-body-structure","Request Body Structure",[104,155,159],{"className":156,"code":157,"language":158,"meta":113,"style":113},"language-json shiki shiki-themes github-light github-dark","{\n  \"companyId\": 1,\n  \"titleId\": \"Judul Bahasa Indonesia\",\n  \"titleEn\": \"English Title\",\n  \"contentId\": \"Konten dalam Bahasa Indonesia...\",\n  \"contentEn\": \"Content in English...\",\n  \"captionId\": \"Caption Indonesia\",\n  \"captionEn\": \"English caption\",\n  \"tags\": [\"tag1\", \"tag2\"],\n  \"media\": [\"base64encodedimage...\"]\n}\n","json",[111,160,161,167,182,195,208,221,234,247,260,281,295],{"__ignoreMap":113},[131,162,163],{"class":133,"line":134},[131,164,166],{"class":165},"sVt8B","{\n",[131,168,169,173,176,179],{"class":133,"line":140},[131,170,172],{"class":171},"sj4cs","  \"companyId\"",[131,174,175],{"class":165},": ",[131,177,178],{"class":171},"1",[131,180,181],{"class":165},",\n",[131,183,184,187,189,193],{"class":133,"line":146},[131,185,186],{"class":171},"  \"titleId\"",[131,188,175],{"class":165},[131,190,192],{"class":191},"sZZnC","\"Judul Bahasa Indonesia\"",[131,194,181],{"class":165},[131,196,198,201,203,206],{"class":133,"line":197},4,[131,199,200],{"class":171},"  \"titleEn\"",[131,202,175],{"class":165},[131,204,205],{"class":191},"\"English Title\"",[131,207,181],{"class":165},[131,209,211,214,216,219],{"class":133,"line":210},5,[131,212,213],{"class":171},"  \"contentId\"",[131,215,175],{"class":165},[131,217,218],{"class":191},"\"Konten dalam Bahasa Indonesia...\"",[131,220,181],{"class":165},[131,222,224,227,229,232],{"class":133,"line":223},6,[131,225,226],{"class":171},"  \"contentEn\"",[131,228,175],{"class":165},[131,230,231],{"class":191},"\"Content in English...\"",[131,233,181],{"class":165},[131,235,237,240,242,245],{"class":133,"line":236},7,[131,238,239],{"class":171},"  \"captionId\"",[131,241,175],{"class":165},[131,243,244],{"class":191},"\"Caption Indonesia\"",[131,246,181],{"class":165},[131,248,250,253,255,258],{"class":133,"line":249},8,[131,251,252],{"class":171},"  \"captionEn\"",[131,254,175],{"class":165},[131,256,257],{"class":191},"\"English caption\"",[131,259,181],{"class":165},[131,261,263,266,269,272,275,278],{"class":133,"line":262},9,[131,264,265],{"class":171},"  \"tags\"",[131,267,268],{"class":165},": [",[131,270,271],{"class":191},"\"tag1\"",[131,273,274],{"class":165},", ",[131,276,277],{"class":191},"\"tag2\"",[131,279,280],{"class":165},"],\n",[131,282,284,287,289,292],{"class":133,"line":283},10,[131,285,286],{"class":171},"  \"media\"",[131,288,268],{"class":165},[131,290,291],{"class":191},"\"base64encodedimage...\"",[131,293,294],{"class":165},"]\n",[131,296,298],{"class":133,"line":297},11,[131,299,300],{"class":165},"}\n",[119,302,304],{"id":303},"company-ids-example","Company IDs (Example)",[306,307,308,324],"table",{},[309,310,311],"thead",{},[312,313,314,318,321],"tr",{},[315,316,317],"th",{},"ID",[315,319,320],{},"Company",[315,322,323],{},"Sector",[325,326,327,338,349,360],"tbody",{},[312,328,329,332,335],{},[330,331,178],"td",{},[330,333,334],{},"Company A",[330,336,337],{},"Engineering",[312,339,340,343,346],{},[330,341,342],{},"2",[330,344,345],{},"Company B",[330,347,348],{},"Technical Solutions",[312,350,351,354,357],{},[330,352,353],{},"3",[330,355,356],{},"Company C",[330,358,359],{},"Projects",[312,361,362,365,368],{},[330,363,364],{},"4",[330,366,367],{},"Company D",[330,369,370],{},"Electrical",[39,372,374],{"id":373},"step-2-create-the-automation-script","Step 2: Create the Automation Script",[14,376,377,378,381],{},"Create ",[111,379,380],{},"scripts\u002Fauto-post-website.py",":",[104,383,387],{"className":384,"code":385,"language":386,"meta":113,"style":113},"language-python shiki shiki-themes github-light github-dark","#!\u002Fusr\u002Fbin\u002Fenv python3\n\"\"\"\nAuto-post to website from image\nUsage: python3 auto-post-website.py \u003Cimage_path> \u003Ccompany_id> \u003Cbrief_description>\n\"\"\"\n\nimport sys\nimport base64\nimport requests\nimport json\n\n# Configuration\nAPI_URL = \"https:\u002F\u002Fyour-website.com\u002Fapi\u002Fposts\"\nAPI_TOKEN = \"your-bearer-token-here\"\n\ndef encode_image(image_path):\n    \"\"\"Convert image to base64\"\"\"\n    with open(image_path, \"rb\") as f:\n        return base64.b64encode(f.read()).decode(\"utf-8\")\n\ndef generate_content(image_path, description, company_name):\n    \"\"\"Generate bilingual content using AI\"\"\"\n    \n    # Read image as base64 for context (optional - depends on your AI setup)\n    image_base64 = encode_image(image_path)\n    \n    prompt = f\"\"\"Generate a bilingual website post about this image.\n\nContext: {description}\nCompany: {company_name}\n\nGenerate in this JSON format:\n{{\n  \"titleId\": \"Judul menarik dalam Bahasa Indonesia\",\n  \"titleEn\": \"Compelling English title\",\n  \"contentId\": \"Konten detail dalam Bahasa Indonesia (2-3 paragraf)\",\n  \"contentEn\": \"Detailed content in English (2-3 paragraphs)\",\n  \"captionId\": \"Caption singkat Indonesia\",\n  \"captionEn\": \"Short English caption\",\n  \"tags\": [\"tag1\", \"tag2\", \"tag3\"]\n}}\n\nGuidelines:\n- Professional tone suitable for company website\n- Highlight key features or achievements\n- Include relevant technical details if applicable\n- SEO-friendly titles\"\"\"\n\n    # Call your AI model (OpenClaw, OpenAI, etc.)\n    # This is a placeholder - replace with actual AI call\n    response = call_ai_model(prompt, image_base64)\n    return json.loads(response)\n\ndef post_to_website(data, image_base64):\n    \"\"\"Post content to website API\"\"\"\n    \n    payload = {\n        **data,\n        \"media\": [image_base64]\n    }\n    \n    headers = {\n        \"Content-Type\": \"application\u002Fjson\",\n        \"Authorization\": f\"Bearer {API_TOKEN}\"\n    }\n    \n    response = requests.post(API_URL, json=payload, headers=headers)\n    return response.json()\n\ndef main():\n    if len(sys.argv) \u003C 4:\n        print(\"Usage: python3 auto-post-website.py \u003Cimage_path> \u003Ccompany_id> \u003Cdescription>\")\n        sys.exit(1)\n    \n    image_path = sys.argv[1]\n    company_id = int(sys.argv[2])\n    description = sys.argv[3]\n    \n    # Company mapping\n    companies = {\n        1: \"Company A\",\n        2: \"Company B\", \n        3: \"Company C\",\n        4: \"Company D\"\n    }\n    company_name = companies.get(company_id, \"Unknown\")\n    \n    print(f\"📝 Processing image for {company_name}...\")\n    \n    # Generate content\n    content = generate_content(image_path, description, company_name)\n    content[\"companyId\"] = company_id\n    \n    print(\"✅ Content generated:\")\n    print(f\"   ID Title: {content['titleId']}\")\n    print(f\"   EN Title: {content['titleEn']}\")\n    \n    # Encode image\n    image_base64 = encode_image(image_path)\n    \n    # Post to website\n    print(\"🚀 Posting to website...\")\n    result = post_to_website(content, image_base64)\n    \n    if result.get(\"success\"):\n        print(f\"✅ Posted successfully!\")\n        print(f\"   Post ID: {result.get('id')}\")\n        print(f\"   URL: {result.get('url')}\")\n    else:\n        print(f\"❌ Failed: {result.get('error')}\")\n        sys.exit(1)\n\nif __name__ == \"__main__\":\n    main()\n","python",[111,388,389,394,399,404,409,413,419,424,429,434,439,443,449,455,461,466,472,478,484,490,495,501,507,513,519,525,530,536,541,547,553,558,564,570,576,582,588,594,600,606,612,618,623,629,635,641,647,653,658,664,670,676,682,687,693,699,704,710,716,722,728,733,739,745,751,756,761,767,773,778,784,790,796,802,807,813,819,825,830,836,842,848,854,860,866,871,877,882,888,893,899,905,911,916,922,928,934,939,945,950,955,961,967,973,978,984,990,996,1002,1008,1014,1019,1024,1030],{"__ignoreMap":113},[131,390,391],{"class":133,"line":134},[131,392,393],{},"#!\u002Fusr\u002Fbin\u002Fenv python3\n",[131,395,396],{"class":133,"line":140},[131,397,398],{},"\"\"\"\n",[131,400,401],{"class":133,"line":146},[131,402,403],{},"Auto-post to website from image\n",[131,405,406],{"class":133,"line":197},[131,407,408],{},"Usage: python3 auto-post-website.py \u003Cimage_path> \u003Ccompany_id> \u003Cbrief_description>\n",[131,410,411],{"class":133,"line":210},[131,412,398],{},[131,414,415],{"class":133,"line":223},[131,416,418],{"emptyLinePlaceholder":417},true,"\n",[131,420,421],{"class":133,"line":236},[131,422,423],{},"import sys\n",[131,425,426],{"class":133,"line":249},[131,427,428],{},"import base64\n",[131,430,431],{"class":133,"line":262},[131,432,433],{},"import requests\n",[131,435,436],{"class":133,"line":283},[131,437,438],{},"import json\n",[131,440,441],{"class":133,"line":297},[131,442,418],{"emptyLinePlaceholder":417},[131,444,446],{"class":133,"line":445},12,[131,447,448],{},"# Configuration\n",[131,450,452],{"class":133,"line":451},13,[131,453,454],{},"API_URL = \"https:\u002F\u002Fyour-website.com\u002Fapi\u002Fposts\"\n",[131,456,458],{"class":133,"line":457},14,[131,459,460],{},"API_TOKEN = \"your-bearer-token-here\"\n",[131,462,464],{"class":133,"line":463},15,[131,465,418],{"emptyLinePlaceholder":417},[131,467,469],{"class":133,"line":468},16,[131,470,471],{},"def encode_image(image_path):\n",[131,473,475],{"class":133,"line":474},17,[131,476,477],{},"    \"\"\"Convert image to base64\"\"\"\n",[131,479,481],{"class":133,"line":480},18,[131,482,483],{},"    with open(image_path, \"rb\") as f:\n",[131,485,487],{"class":133,"line":486},19,[131,488,489],{},"        return base64.b64encode(f.read()).decode(\"utf-8\")\n",[131,491,493],{"class":133,"line":492},20,[131,494,418],{"emptyLinePlaceholder":417},[131,496,498],{"class":133,"line":497},21,[131,499,500],{},"def generate_content(image_path, description, company_name):\n",[131,502,504],{"class":133,"line":503},22,[131,505,506],{},"    \"\"\"Generate bilingual content using AI\"\"\"\n",[131,508,510],{"class":133,"line":509},23,[131,511,512],{},"    \n",[131,514,516],{"class":133,"line":515},24,[131,517,518],{},"    # Read image as base64 for context (optional - depends on your AI setup)\n",[131,520,522],{"class":133,"line":521},25,[131,523,524],{},"    image_base64 = encode_image(image_path)\n",[131,526,528],{"class":133,"line":527},26,[131,529,512],{},[131,531,533],{"class":133,"line":532},27,[131,534,535],{},"    prompt = f\"\"\"Generate a bilingual website post about this image.\n",[131,537,539],{"class":133,"line":538},28,[131,540,418],{"emptyLinePlaceholder":417},[131,542,544],{"class":133,"line":543},29,[131,545,546],{},"Context: {description}\n",[131,548,550],{"class":133,"line":549},30,[131,551,552],{},"Company: {company_name}\n",[131,554,556],{"class":133,"line":555},31,[131,557,418],{"emptyLinePlaceholder":417},[131,559,561],{"class":133,"line":560},32,[131,562,563],{},"Generate in this JSON format:\n",[131,565,567],{"class":133,"line":566},33,[131,568,569],{},"{{\n",[131,571,573],{"class":133,"line":572},34,[131,574,575],{},"  \"titleId\": \"Judul menarik dalam Bahasa Indonesia\",\n",[131,577,579],{"class":133,"line":578},35,[131,580,581],{},"  \"titleEn\": \"Compelling English title\",\n",[131,583,585],{"class":133,"line":584},36,[131,586,587],{},"  \"contentId\": \"Konten detail dalam Bahasa Indonesia (2-3 paragraf)\",\n",[131,589,591],{"class":133,"line":590},37,[131,592,593],{},"  \"contentEn\": \"Detailed content in English (2-3 paragraphs)\",\n",[131,595,597],{"class":133,"line":596},38,[131,598,599],{},"  \"captionId\": \"Caption singkat Indonesia\",\n",[131,601,603],{"class":133,"line":602},39,[131,604,605],{},"  \"captionEn\": \"Short English caption\",\n",[131,607,609],{"class":133,"line":608},40,[131,610,611],{},"  \"tags\": [\"tag1\", \"tag2\", \"tag3\"]\n",[131,613,615],{"class":133,"line":614},41,[131,616,617],{},"}}\n",[131,619,621],{"class":133,"line":620},42,[131,622,418],{"emptyLinePlaceholder":417},[131,624,626],{"class":133,"line":625},43,[131,627,628],{},"Guidelines:\n",[131,630,632],{"class":133,"line":631},44,[131,633,634],{},"- Professional tone suitable for company website\n",[131,636,638],{"class":133,"line":637},45,[131,639,640],{},"- Highlight key features or achievements\n",[131,642,644],{"class":133,"line":643},46,[131,645,646],{},"- Include relevant technical details if applicable\n",[131,648,650],{"class":133,"line":649},47,[131,651,652],{},"- SEO-friendly titles\"\"\"\n",[131,654,656],{"class":133,"line":655},48,[131,657,418],{"emptyLinePlaceholder":417},[131,659,661],{"class":133,"line":660},49,[131,662,663],{},"    # Call your AI model (OpenClaw, OpenAI, etc.)\n",[131,665,667],{"class":133,"line":666},50,[131,668,669],{},"    # This is a placeholder - replace with actual AI call\n",[131,671,673],{"class":133,"line":672},51,[131,674,675],{},"    response = call_ai_model(prompt, image_base64)\n",[131,677,679],{"class":133,"line":678},52,[131,680,681],{},"    return json.loads(response)\n",[131,683,685],{"class":133,"line":684},53,[131,686,418],{"emptyLinePlaceholder":417},[131,688,690],{"class":133,"line":689},54,[131,691,692],{},"def post_to_website(data, image_base64):\n",[131,694,696],{"class":133,"line":695},55,[131,697,698],{},"    \"\"\"Post content to website API\"\"\"\n",[131,700,702],{"class":133,"line":701},56,[131,703,512],{},[131,705,707],{"class":133,"line":706},57,[131,708,709],{},"    payload = {\n",[131,711,713],{"class":133,"line":712},58,[131,714,715],{},"        **data,\n",[131,717,719],{"class":133,"line":718},59,[131,720,721],{},"        \"media\": [image_base64]\n",[131,723,725],{"class":133,"line":724},60,[131,726,727],{},"    }\n",[131,729,731],{"class":133,"line":730},61,[131,732,512],{},[131,734,736],{"class":133,"line":735},62,[131,737,738],{},"    headers = {\n",[131,740,742],{"class":133,"line":741},63,[131,743,744],{},"        \"Content-Type\": \"application\u002Fjson\",\n",[131,746,748],{"class":133,"line":747},64,[131,749,750],{},"        \"Authorization\": f\"Bearer {API_TOKEN}\"\n",[131,752,754],{"class":133,"line":753},65,[131,755,727],{},[131,757,759],{"class":133,"line":758},66,[131,760,512],{},[131,762,764],{"class":133,"line":763},67,[131,765,766],{},"    response = requests.post(API_URL, json=payload, headers=headers)\n",[131,768,770],{"class":133,"line":769},68,[131,771,772],{},"    return response.json()\n",[131,774,776],{"class":133,"line":775},69,[131,777,418],{"emptyLinePlaceholder":417},[131,779,781],{"class":133,"line":780},70,[131,782,783],{},"def main():\n",[131,785,787],{"class":133,"line":786},71,[131,788,789],{},"    if len(sys.argv) \u003C 4:\n",[131,791,793],{"class":133,"line":792},72,[131,794,795],{},"        print(\"Usage: python3 auto-post-website.py \u003Cimage_path> \u003Ccompany_id> \u003Cdescription>\")\n",[131,797,799],{"class":133,"line":798},73,[131,800,801],{},"        sys.exit(1)\n",[131,803,805],{"class":133,"line":804},74,[131,806,512],{},[131,808,810],{"class":133,"line":809},75,[131,811,812],{},"    image_path = sys.argv[1]\n",[131,814,816],{"class":133,"line":815},76,[131,817,818],{},"    company_id = int(sys.argv[2])\n",[131,820,822],{"class":133,"line":821},77,[131,823,824],{},"    description = sys.argv[3]\n",[131,826,828],{"class":133,"line":827},78,[131,829,512],{},[131,831,833],{"class":133,"line":832},79,[131,834,835],{},"    # Company mapping\n",[131,837,839],{"class":133,"line":838},80,[131,840,841],{},"    companies = {\n",[131,843,845],{"class":133,"line":844},81,[131,846,847],{},"        1: \"Company A\",\n",[131,849,851],{"class":133,"line":850},82,[131,852,853],{},"        2: \"Company B\", \n",[131,855,857],{"class":133,"line":856},83,[131,858,859],{},"        3: \"Company C\",\n",[131,861,863],{"class":133,"line":862},84,[131,864,865],{},"        4: \"Company D\"\n",[131,867,869],{"class":133,"line":868},85,[131,870,727],{},[131,872,874],{"class":133,"line":873},86,[131,875,876],{},"    company_name = companies.get(company_id, \"Unknown\")\n",[131,878,880],{"class":133,"line":879},87,[131,881,512],{},[131,883,885],{"class":133,"line":884},88,[131,886,887],{},"    print(f\"📝 Processing image for {company_name}...\")\n",[131,889,891],{"class":133,"line":890},89,[131,892,512],{},[131,894,896],{"class":133,"line":895},90,[131,897,898],{},"    # Generate content\n",[131,900,902],{"class":133,"line":901},91,[131,903,904],{},"    content = generate_content(image_path, description, company_name)\n",[131,906,908],{"class":133,"line":907},92,[131,909,910],{},"    content[\"companyId\"] = company_id\n",[131,912,914],{"class":133,"line":913},93,[131,915,512],{},[131,917,919],{"class":133,"line":918},94,[131,920,921],{},"    print(\"✅ Content generated:\")\n",[131,923,925],{"class":133,"line":924},95,[131,926,927],{},"    print(f\"   ID Title: {content['titleId']}\")\n",[131,929,931],{"class":133,"line":930},96,[131,932,933],{},"    print(f\"   EN Title: {content['titleEn']}\")\n",[131,935,937],{"class":133,"line":936},97,[131,938,512],{},[131,940,942],{"class":133,"line":941},98,[131,943,944],{},"    # Encode image\n",[131,946,948],{"class":133,"line":947},99,[131,949,524],{},[131,951,953],{"class":133,"line":952},100,[131,954,512],{},[131,956,958],{"class":133,"line":957},101,[131,959,960],{},"    # Post to website\n",[131,962,964],{"class":133,"line":963},102,[131,965,966],{},"    print(\"🚀 Posting to website...\")\n",[131,968,970],{"class":133,"line":969},103,[131,971,972],{},"    result = post_to_website(content, image_base64)\n",[131,974,976],{"class":133,"line":975},104,[131,977,512],{},[131,979,981],{"class":133,"line":980},105,[131,982,983],{},"    if result.get(\"success\"):\n",[131,985,987],{"class":133,"line":986},106,[131,988,989],{},"        print(f\"✅ Posted successfully!\")\n",[131,991,993],{"class":133,"line":992},107,[131,994,995],{},"        print(f\"   Post ID: {result.get('id')}\")\n",[131,997,999],{"class":133,"line":998},108,[131,1000,1001],{},"        print(f\"   URL: {result.get('url')}\")\n",[131,1003,1005],{"class":133,"line":1004},109,[131,1006,1007],{},"    else:\n",[131,1009,1011],{"class":133,"line":1010},110,[131,1012,1013],{},"        print(f\"❌ Failed: {result.get('error')}\")\n",[131,1015,1017],{"class":133,"line":1016},111,[131,1018,801],{},[131,1020,1022],{"class":133,"line":1021},112,[131,1023,418],{"emptyLinePlaceholder":417},[131,1025,1027],{"class":133,"line":1026},113,[131,1028,1029],{},"if __name__ == \"__main__\":\n",[131,1031,1033],{"class":133,"line":1032},114,[131,1034,1035],{},"    main()\n",[39,1037,1039],{"id":1038},"step-3-test-the-script","Step 3: Test the Script",[104,1041,1045],{"className":1042,"code":1043,"language":1044,"meta":113,"style":113},"language-bash shiki shiki-themes github-light github-dark","# Make executable\nchmod +x scripts\u002Fauto-post-website.py\n\n# Test with sample image\npython3 scripts\u002Fauto-post-website.py \\\n  \u002Fpath\u002Fto\u002Fimage.jpg \\\n  2 \\\n  \"New equipment arrival for upcoming project\"\n","bash",[111,1046,1047,1053,1065,1069,1074,1085,1092,1099],{"__ignoreMap":113},[131,1048,1049],{"class":133,"line":134},[131,1050,1052],{"class":1051},"sJ8bj","# Make executable\n",[131,1054,1055,1059,1062],{"class":133,"line":140},[131,1056,1058],{"class":1057},"sScJk","chmod",[131,1060,1061],{"class":191}," +x",[131,1063,1064],{"class":191}," scripts\u002Fauto-post-website.py\n",[131,1066,1067],{"class":133,"line":146},[131,1068,418],{"emptyLinePlaceholder":417},[131,1070,1071],{"class":133,"line":197},[131,1072,1073],{"class":1051},"# Test with sample image\n",[131,1075,1076,1079,1082],{"class":133,"line":210},[131,1077,1078],{"class":1057},"python3",[131,1080,1081],{"class":191}," scripts\u002Fauto-post-website.py",[131,1083,1084],{"class":171}," \\\n",[131,1086,1087,1090],{"class":133,"line":223},[131,1088,1089],{"class":191},"  \u002Fpath\u002Fto\u002Fimage.jpg",[131,1091,1084],{"class":171},[131,1093,1094,1097],{"class":133,"line":236},[131,1095,1096],{"class":171},"  2",[131,1098,1084],{"class":171},[131,1100,1101],{"class":133,"line":249},[131,1102,1103],{"class":191},"  \"New equipment arrival for upcoming project\"\n",[14,1105,1106],{},[18,1107,1108],{},"Expected Output:",[104,1110,1113],{"className":1111,"code":1112,"language":109},[107],"📝 Processing image for Company B...\n✅ Content generated:\n   ID Title: Penerimaan Peralatan Baru untuk Proyek Mendatang\n   EN Title: New Equipment Arrival for Upcoming Project\n🚀 Posting to website...\n✅ Posted successfully!\n   Post ID: 47\n   URL: https:\u002F\u002Fyour-website.com\u002Fposts\u002F47\n",[111,1114,1112],{"__ignoreMap":113},[39,1116,1118],{"id":1117},"step-4-integrate-with-openclaw","Step 4: Integrate with OpenClaw",[14,1120,377,1121,381],{},[111,1122,1123],{},"skills\u002Fauto-post\u002FSKILL.md",[104,1125,1129],{"className":1126,"code":1127,"language":1128,"meta":113,"style":113},"language-markdown shiki shiki-themes github-light github-dark","# Auto-Post to Website\n\nGenerate bilingual content from images and auto-post to website.\n\n## Usage\n\n```bash\npython3 scripts\u002Fauto-post-website.py \u003Cimage> \u003Ccompany_id> \"\u003Cdescription>\"\n","markdown",[111,1130,1131,1136,1140,1145,1149,1154,1158,1163],{"__ignoreMap":113},[131,1132,1133],{"class":133,"line":134},[131,1134,1135],{},"# Auto-Post to Website\n",[131,1137,1138],{"class":133,"line":140},[131,1139,418],{"emptyLinePlaceholder":417},[131,1141,1142],{"class":133,"line":146},[131,1143,1144],{},"Generate bilingual content from images and auto-post to website.\n",[131,1146,1147],{"class":133,"line":197},[131,1148,418],{"emptyLinePlaceholder":417},[131,1150,1151],{"class":133,"line":210},[131,1152,1153],{},"## Usage\n",[131,1155,1156],{"class":133,"line":223},[131,1157,418],{"emptyLinePlaceholder":417},[131,1159,1160],{"class":133,"line":236},[131,1161,1162],{},"```bash\n",[131,1164,1165],{"class":133,"line":249},[131,1166,1167],{},"python3 scripts\u002Fauto-post-website.py \u003Cimage> \u003Ccompany_id> \"\u003Cdescription>\"\n",[39,1169,1171],{"id":1170},"companies","Companies",[306,1173,1174,1183],{},[309,1175,1176],{},[312,1177,1178,1180],{},[315,1179,317],{},[315,1181,1182],{},"Name",[325,1184,1185,1191,1197,1203],{},[312,1186,1187,1189],{},[330,1188,178],{},[330,1190,334],{},[312,1192,1193,1195],{},[330,1194,342],{},[330,1196,345],{},[312,1198,1199,1201],{},[330,1200,353],{},[330,1202,356],{},[312,1204,1205,1207],{},[330,1206,364],{},[330,1208,367],{},[104,1210,1213],{"className":1211,"code":1212,"language":109},[107],"\n## Step 5: Telegram Integration\n\nAdd to your bot handler:\n\n```python\n# When user sends photo with caption\nif message.photo and message.caption:\n    # Extract company from caption or ask\n    company_id = extract_company(message.caption)\n    description = message.caption\n    \n    # Download photo\n    photo_path = download_photo(message.photo[-1])\n    \n    # Execute auto-post\n    result = subprocess.run([\n        \"python3\", \"scripts\u002Fauto-post-website.py\",\n        photo_path, str(company_id), description\n    ], capture_output=True, text=True)\n    \n    # Send result to user\n    bot.send_message(chat_id, result.stdout)\n",[111,1214,1212],{"__ignoreMap":113},[39,1216,1218],{"id":1217},"advanced-features","Advanced Features",[119,1220,1222],{"id":1221},"multiple-images-support","Multiple Images Support",[14,1224,1225],{},"Modify script to handle image arrays:",[104,1227,1229],{"className":384,"code":1228,"language":386,"meta":113,"style":113},"media = []\nfor img_path in image_paths:\n    media.append(encode_image(img_path))\n    \npayload[\"media\"] = media\n",[111,1230,1231,1236,1241,1246,1250],{"__ignoreMap":113},[131,1232,1233],{"class":133,"line":134},[131,1234,1235],{},"media = []\n",[131,1237,1238],{"class":133,"line":140},[131,1239,1240],{},"for img_path in image_paths:\n",[131,1242,1243],{"class":133,"line":146},[131,1244,1245],{},"    media.append(encode_image(img_path))\n",[131,1247,1248],{"class":133,"line":197},[131,1249,512],{},[131,1251,1252],{"class":133,"line":210},[131,1253,1254],{},"payload[\"media\"] = media\n",[119,1256,1258],{"id":1257},"auto-tagging","Auto-Tagging",[14,1260,1261],{},"Add AI-powered tag generation:",[104,1263,1265],{"className":384,"code":1264,"language":386,"meta":113,"style":113},"def generate_tags(content):\n    prompt = f\"Generate 3-5 SEO tags for: {content['titleEn']}\"\n    tags = call_ai_model(prompt)\n    return tags.split(\", \")\n",[111,1266,1267,1272,1277,1282],{"__ignoreMap":113},[131,1268,1269],{"class":133,"line":134},[131,1270,1271],{},"def generate_tags(content):\n",[131,1273,1274],{"class":133,"line":140},[131,1275,1276],{},"    prompt = f\"Generate 3-5 SEO tags for: {content['titleEn']}\"\n",[131,1278,1279],{"class":133,"line":146},[131,1280,1281],{},"    tags = call_ai_model(prompt)\n",[131,1283,1284],{"class":133,"line":197},[131,1285,1286],{},"    return tags.split(\", \")\n",[119,1288,1290],{"id":1289},"scheduling","Scheduling",[14,1292,1293],{},"Queue posts for later:",[104,1295,1297],{"className":384,"code":1296,"language":386,"meta":113,"style":113},"from datetime import datetime, timedelta\n\npayload[\"publishAt\"] = (datetime.now() + timedelta(hours=1)).isoformat()\n",[111,1298,1299,1304,1308],{"__ignoreMap":113},[131,1300,1301],{"class":133,"line":134},[131,1302,1303],{},"from datetime import datetime, timedelta\n",[131,1305,1306],{"class":133,"line":140},[131,1307,418],{"emptyLinePlaceholder":417},[131,1309,1310],{"class":133,"line":146},[131,1311,1312],{},"payload[\"publishAt\"] = (datetime.now() + timedelta(hours=1)).isoformat()\n",[39,1314,1316],{"id":1315},"security-considerations","Security Considerations",[47,1318,1319,1325,1331,1337],{},[50,1320,1321,1324],{},[18,1322,1323],{},"Store API tokens securely"," — use environment variables or keyring",[50,1326,1327,1330],{},[18,1328,1329],{},"Validate image types"," — only accept jpg, png, webp",[50,1332,1333,1336],{},[18,1334,1335],{},"Rate limiting"," — prevent spam by limiting posts per hour",[50,1338,1339,1342],{},[18,1340,1341],{},"Review before publish"," — add moderation queue for new users",[39,1344,1346],{"id":1345},"troubleshooting","Troubleshooting",[119,1348,1350],{"id":1349},"image-too-large","Image too large",[104,1352,1354],{"className":384,"code":1353,"language":386,"meta":113,"style":113},"from PIL import Image\n\ndef resize_image(image_path, max_size=(1920, 1080)):\n    img = Image.open(image_path)\n    img.thumbnail(max_size)\n    img.save(image_path, quality=85)\n",[111,1355,1356,1361,1365,1370,1375,1380],{"__ignoreMap":113},[131,1357,1358],{"class":133,"line":134},[131,1359,1360],{},"from PIL import Image\n",[131,1362,1363],{"class":133,"line":140},[131,1364,418],{"emptyLinePlaceholder":417},[131,1366,1367],{"class":133,"line":146},[131,1368,1369],{},"def resize_image(image_path, max_size=(1920, 1080)):\n",[131,1371,1372],{"class":133,"line":197},[131,1373,1374],{},"    img = Image.open(image_path)\n",[131,1376,1377],{"class":133,"line":210},[131,1378,1379],{},"    img.thumbnail(max_size)\n",[131,1381,1382],{"class":133,"line":223},[131,1383,1384],{},"    img.save(image_path, quality=85)\n",[119,1386,1388],{"id":1387},"api-timeout","API timeout",[104,1390,1392],{"className":384,"code":1391,"language":386,"meta":113,"style":113},"response = requests.post(API_URL, json=payload, headers=headers, timeout=30)\n",[111,1393,1394],{"__ignoreMap":113},[131,1395,1396],{"class":133,"line":134},[131,1397,1391],{},[119,1399,1401],{"id":1400},"base64-too-large","Base64 too large",[67,1403,1404,1407],{},[50,1405,1406],{},"Resize images before encoding",[50,1408,1409],{},"Use image CDN URLs instead of base64 if API supports it",[39,1411,1413],{"id":1412},"conclusion","Conclusion",[14,1415,1416],{},"You now have an automated content pipeline that transforms photos into polished, bilingual website posts. Perfect for:",[67,1418,1419,1422,1425,1428],{},[50,1420,1421],{},"📸 Product showcases",[50,1423,1424],{},"🏗️ Project updates",[50,1426,1427],{},"📋 Portfolio entries",[50,1429,1430],{},"📊 Progress documentation",[14,1432,1433],{},[18,1434,1435],{},"Next Steps:",[67,1437,1438,1441,1444,1447],{},[50,1439,1440],{},"Add image watermarking",[50,1442,1443],{},"Integrate with cloud storage (Drive, S3)",[50,1445,1446],{},"Build approval workflow",[50,1448,1449],{},"Add analytics tracking",[1451,1452],"hr",{},[14,1454,1455],{},[1456,1457,1458],"em",{},"Tutorial created for OpenClaw Sumopod",[1460,1461,1462],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":113,"searchDepth":140,"depth":140,"links":1464},[1465,1466,1467,1468,1469,1474,1475,1476,1477,1478,1483,1484,1489],{"id":41,"depth":140,"text":42},{"id":64,"depth":140,"text":65},{"id":83,"depth":140,"text":84},{"id":101,"depth":140,"text":102},{"id":116,"depth":140,"text":117,"children":1470},[1471,1472,1473],{"id":121,"depth":146,"text":122},{"id":152,"depth":146,"text":153},{"id":303,"depth":146,"text":304},{"id":373,"depth":140,"text":374},{"id":1038,"depth":140,"text":1039},{"id":1117,"depth":140,"text":1118},{"id":1170,"depth":140,"text":1171},{"id":1217,"depth":140,"text":1218,"children":1479},[1480,1481,1482],{"id":1221,"depth":146,"text":1222},{"id":1257,"depth":146,"text":1258},{"id":1289,"depth":146,"text":1290},{"id":1315,"depth":140,"text":1316},{"id":1345,"depth":140,"text":1346,"children":1485},[1486,1487,1488],{"id":1349,"depth":146,"text":1350},{"id":1387,"depth":146,"text":1388},{"id":1400,"depth":146,"text":1401},{"id":1412,"depth":140,"text":1413},"tech","2026-03-08","Stop copy-paste manual. Setup auto-posting dari draft ke website dalam hitungan menit.","md","\u002Fimages\u002Fposts\u002Fauto-post-ke-website.jpg",{},"\u002Ftech\u002Fauto-post-ke-website","6",{"title":5,"description":1492},"tech\u002Fauto-post-ke-website",[1501,1502,1503,1504],"automation","website","content","openclaw","aK9_VZww3FzIg_rekNwO3ZmsbS1GEBmjb37iWDFjJxI",1775293420464]