-
-
Save cchana/0317b97aba7e757a7e3ea1598a38cb2b to your computer and use it in GitHub Desktop.
| <?php | |
| # Login info, set an app password at https://bsky.app/settings/app-passwords | |
| $password = 'p4ssw0rd'; | |
| $handle = 'your.handle'; | |
| # URL and data for creating a session | |
| $apiKeyUrl ='https://bsky.social/xrpc/com.atproto.server.createSession'; | |
| $apiKeyPostData='{"identifier": "'.$handle.'", "password": "'.$password.'" }'; | |
| # If the details have been saved, used them | |
| if (file_exists('bsky.tokens')) { | |
| $apiData = json_decode(file_get_contents('bsky.tokens'), true); | |
| # Else, fetch and set the data | |
| } else { | |
| # cURL to login | |
| $ch = curl_init(); | |
| $allHeaders = array(); | |
| curl_setopt($ch, CURLOPT_HEADER, false); | |
| curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json')); | |
| curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); | |
| curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); | |
| curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); | |
| curl_setopt($ch, CURLOPT_POSTFIELDS, $apiKeyPostData); | |
| curl_setopt($ch, CURLOPT_URL, $apiKeyUrl); | |
| $apiData = json_decode(curl_exec($ch), true); | |
| curl_close($ch); | |
| # Store the token content so we don't have to keep logging in | |
| file_put_contents('bsky.tokens', $apiData); | |
| } | |
| # Store the DID and JWT | |
| $did = $apiData['did']; | |
| $key = $apiData['accessJwt']; | |
| # Created at date | |
| $date = date('Y-m-d\TH:i:s.Z\Z'); | |
| # URL and data for creating a post | |
| $feedPostUrl='https://bsky.social/xrpc/com.atproto.repo.createRecord'; | |
| $feedPostData='{"collection":"app.bsky.feed.post", "repo":"'.$did.'", "record":{"text":"Hello, world!", "createdAt":"'.$date.'", "type":"app.bsky.feed.post"}}'; | |
| # cURL to post | |
| $ch = curl_init(); | |
| $allHeaders = array(); | |
| curl_setopt($ch, CURLOPT_HEADER, false); | |
| curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json', 'Authorization: Bearer '.$key)); | |
| curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); | |
| curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); | |
| curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); | |
| curl_setopt($ch, CURLOPT_POSTFIELDS, $feedPostData); | |
| curl_setopt($ch, CURLOPT_URL, $feedPostUrl); | |
| $postData = json_decode(curl_exec($ch), true); | |
| curl_close($ch); | |
| # If it was posted OK | |
| if ($postData['validationStatus'] == 'valid') { | |
| $postIdParts = explode('/', $postData['uri']); | |
| $postId = end($postIdParts); | |
| # Display a link to the post | |
| echo '<a href="https://bsky.app/profile/'.$handle.'/post/'.$postId.'">View post on Bluesky</a>'; | |
| } |
Yes, you need to submit the image to https://bsky.social/xrpc/com.atproto.repo.uploadBlob first, so that it can be attached to your post as an embed. But the principle is the same. It's covered in the Bluesky API documentation here: https://docs.bsky.app/docs/advanced-guides/posts#images-embeds
Good luck!
Hello,
I'm sorry but my knowledge is limited and only with PHP.
I can't add libraries to my server either, so the only way I have is the one you explain.
Could you modify this PHP to be able to include images and also how to add line breaks.
Thanks and apologies.
Sorry, not something I can do right now but if I get time to upload a new gist for image uploads I will. To help get you started, the postData would just be the contents of the image file sent to the end point I shared before. You'll get a response with details of the face that you can then add to the next API call when you're making your pots.
Hi,
It's possible post an image and/or url with this simple system?
Best regards,