Tuesday, March 24, 2015

Making Twitter Media Upload Api work with Java

I was trying to upload an image and do status update on twitter using there api version 1.1.
For this I was using media/upload.json . I was trying to send content of files as base64 encoded string and setting the appropriate content-type and content-transfer-encoding. But this didn't work.
I was getting errors like:

1) Missing paramter media
2) Could not authenticate.

My main reason to use this approach was I was getting image url and didn't wanted to save it into a file.

But this never worked, then I took a different approach of saving the imageurl into a file and doing a multi part upload. Code for it is below. Hope this helps someone.

private String uploadImage(String imageUrl)
File f = new File("/tmp/twitterUploadImage_"+StringUtil.encodeURL(imageUrl));
FileUtils.copyURLToFile(new URL(imageUrl), f);
catch (IOException e)
logger.severe("Failed to save image in a file");
return null;
UrlReader.FetchResponse resp = post(TWITTER_UPLOAD_URL + "media/upload.json", f, "media", true);
if (resp == null || StringUtil.isEmpty(resp.body)) return null;
JSONObject obj = new JSONObject(resp.body);
if (obj.has("media_id_string"))
return obj.getString("media_id_string");
logger.severe("Media Id not found "+ resp.body);
catch (JSONException jse)
logger.severe("JSON exception "+ resp.body);
return null;

public UrlReader.FetchResponse post(String url, File file, String paramName, boolean personaSpecific) //Not changing SocialAuthorization rightaway.
Persona person = this.loadPersona(index, personaSpecific);
if(person == null)
return null;
Token accessToken = new Token(person.getToken(), person.getKey());
OAuthRequest req = new OAuthRequest(Verb.POST, url);
OAUTHSERVICE.signRequest(accessToken, req);
HttpEntity entity = createMultipartEntity(file, paramName);
UrlReader.FetchResponse response = UrlReader.HttpPost(url, req.getHeaders(), entity);
return response;

private HttpEntity createMultipartEntity(File f, String paramName)
MultipartEntityBuilder builder = MultipartEntityBuilder.create();      
FileBody fileBody = new FileBody(f); //image should be a String
builder.addPart(paramName, fileBody);
HttpEntity entity = builder.build();
return entity;

Friday, March 20, 2015

Making Facebook Graph Photos Api Work with url

As per the documentation on Facebook https://developers.facebook.com/docs/graph-api/reference/v2.2/user/photos/

For /photos api if we want to post a photo to user timeline, using an url on open internet then we must:

POST /v2.2/me/photos HTTP/1.1
Host: graph.facebook.com


But this gives:

  "error": {
    "message": "An unknown error has occurred.",
    "type": "OAuthException",
    "code": 1

We should avoid adding {} or encode %7B and %7D around image-url for this to work. So correct would be:

POST /v2.2/me/photos HTTP/1.1
Host: graph.facebook.com


Tuesday, March 17, 2015

Git CheatSheet/Quickguide

  • Git Rebase Command
git checkout branch name # checkout branch on which you want to merge
git rebase branch_name # Original branch would be rebased to current branch.

Rebase would remove changes in your branch and merge all the changes from the new branch then applyour changes on top of it.
  • Git merge from a branch.
git checkout branch name # checkout branch on which you want to merge
git merge branch_name # branch_name is the branch from which you want to merge
  • Reverting merge conflict files
git reset --hard HEAD file_name # hard revert to HEAD
  • Reverting to the last commited changes on a branch:
git reset --hard HEAD # hard revert to HEAD
  • Switching branches without committing changes:
git add uncommited_files # Add uncommitted files to index
git stash # Stash your changes
git checkout new_branch # Switch to new branch,
# Work on the new branch
git stash pop # Switch back to old branch with your changes
  • Creating a new branch on Git and checking it out:
git checkout -b new_branch # Create a new branch
  • Renaming a Git branch on Local and  on Remote:
git branch -m old_branch new_branch # Rename branch locally
git push origin :old_branch # Delete the old branch
git push --set-upstream origin new_branch # Push the new branch, set local branch to track the new remote

  • Working with stash:
git stash list # Lists all the saved stashed
git stash drop stash_name # Deletes a saved stash
git stash clear # Deletes all saved stash