Calling Twitter REST api from JavaScript with OAUTH

I’ve started on a project where I need to call Twitter’s REST apis from a Node.js JavaScript app. I’ve built a Java app before that integrated with Twitter, but used a library to help with the OAUTH authentication. Looking around for a JavaScript library, it looks like node-oauth does what I need to do, so gave it a go.

Twitter’s API docs are pretty good, but I ran into an issue with node-oauth with an error coming back from:

POST /statuses/update.json

which returned this message:

{ statusCode: 401,
 data: '{"errors":[{"code":32,"message":"Could not authenticate you."}]}' }

which is odd because using the node-oauth library to authenticate and then call any of the GET apis with node-oauth was working fine. If you Google this error there’s numerous posts about this error for all number of reasons, so I’m not sure it’s a particularly specific message.

Here’s a working example for a GET:

First, use node-oauth to authenticate with your Twitter key, secret, and app access token and secret (which you can set up here):

var oauth = new OAuth.OAuth(
    'https://api.twitter.com/oauth/request_token',
    'https://api.twitter.com/oauth/access_token',
    config.twitterConsumerKey,
    config.twitterSecretKey,
    '1.0A',
    null,
    'HMAC-SHA1'
);

Next, using the returned value from this call, make the GET request (it builds the request including the OAUTH headers for you):

//GET /search/tweets.json
oauth.get(
    'https://api.twitter.com/1.1/search/tweets.json?q=%40twitterapi',
    config.accessToken,
    config.accessTokenSecret,
    function (e, data, res){
        if (e) console.error(e);
        console.log(data);
    });

Attempting a POST to update the status for this account using the similar api:

var status = "{'status':'test 3 from nodejs'}";

oauth.post('https://api.twitter.com/1.1/statuses/update.json',
    config.accessToken,
    config.accessTokenSecret,
    status,
    function(error, data) {
        console.log('\nPOST status:\n');
        console.log(error || data);
});

And this is the call that returned the error about “could not authenticate”.

Looking through a few other tickets for the node-oauth project, this one gave a clue – this particular issue was about special chars in the body content to the POST, but it gave an example of the body formed like this:

var status = ({'status':'test from nodejs'});

I would have thought passing a String would have worked, but I guess the api is expecting an object? Anyway, this is working, and looks good so far.

Retro Battlestation (update 2): dialing up a local BBS with the 2002 Power Mac G4 Quicksilver

Since my first post after receiving my 2002 Power Mac G4 Quicksilver, I’ve learned a number of things about this machine.

Following the Retro Battlestations subreddit, there was a group activity a while back to dial into the group’s BBS using, yes, a real dial up modem, from your retro machine of choice. So I thought I’d give it a go.

The internal modem is on a board

Internal modem missing

about the size of a pack of cards, and it’s normally screwed to standoffs on motherboard in the top left of the motherboard in this photo. It was obviously removed in this machine, so that explains why an internal modem was not showing up as installed.

Not to be deterred, I noticed you can pick up an Apple USB modem for just $10 online so I ordered one. Wanting to give it a go truely old-style, I wanted to dial in from OS 9 – this is when I found out that this USB Modem is a ‘soft’ modem, in that it works mostly in software, and no, it’s not supported on OS 9.

In OS X 10.4 however, it gets recognized correctly as an External Modem in the System Preferences panel:

 

 

 

 

 

 

For a dial up terminal emulator for the Mac, I found most references pointing to ZTerm , so got it downloaded and installed, and it sees the USB modem. Got the BBS number configured, and off we go!

 

 

Success! Dialed in to the Level 29 BBS! I was expecting to see ANSI colors in the text display, so not sure if I need to change a setting in ZTerm, but so far pretty excited this works!

 

git error: “refusing to merge unrelated histories”

When working with local git repos, whenever I add a remote repo on github and then try to pull down the master from remote to local, I get errors about local repo not being on the same branch as the remote, or more recently this error:

fatal: refusing to merge unrelated histories

I think in the past I’ve done a ‘reset –hard’ like described here, but this didn’t work for me this time, I got the same error about ‘unrelated histories’

Turns out this might be related to a change in git behavior, as described here.

Doing:

git pull github master --allow-unrelated-histories

and then followed with:

git push github master

fixed my issue.

Retro Battestation: just received my 2002 Power Mac G4 Quicksilver

I just picked up a pretty good eBay deal on a 2002 Power Mac G4 Quicksilver. It was sold as working, and yes it does boot up and it did come with OS X 10.4.11 installed as advertised.

 

Inside, it looks almost new. When I recently took some old PC towers to the electronics recycling inside they looked like they’d accumulated 100 years worth of dust and god knows what. By comparison, for a 15 year old machine, this looks like it was kept sealed in a box for most of that time – it’s spotless with no dust in sight.

Clean!

It looks like it has 10.4.11 cleanly installed, but I also picked up a used OS X 10.4 Tiger DVD to do a clean install myself.

The DVD drive in the machine does not want to open. It whirs and clicks when you hold F12, but no go. I used the paper clip trick in the manual open hole on the front of the drive, it opens up and there’s nothing jammed in there, it just doesn’t want to open. I tried putting the DVD in there, manually closing the drive and then powering on, but it doesn’t spin up and read the disk.

By the way, on this Power Mac G4 Quicksilver, the DVD manual open hole is obscured by the front of the case, so the only way to get a paper clip in the hole is to physically remove the drive from the case to get access to the hole.

Given the issues with the DVD drive, I discovered that this machine will boot from a USB flash drive (there’s a discussion in this thread about all Intel Macs will boot from USB, but this feature apparently was supported on some G4 and G5 machines but apparently not all).

To install Mac OS 9 I copied the ISO from OS9Lives universal installer to a USB using Infrarecorder on a Windows 10 desktop, and holding down Option/Alt to get the boot menu, it shows the USB, and clicking on it starts to boot. I wasn’t sure about using the ‘Restore’ option on the OS9Lives universal installer, as it seems from the instructions that it wipes your partition.

 

 

Instead I’ve read in a few different forum posts if you just copy the ‘System Folder’ from an OS 9 image to the drive, along with ‘Applications’ (rename it ‘Applications (OS 9)’ if you’re dragging them to the same partition as OS X, if it’s a different partition then the name can stay as Applications).

 

Interesting that this just works – if you select the OS 9 System Folder as the Startup Disk in System Preferences, then when you reboot it just starts up.

To get a copy of the OS X 10.4 DVD onto a USB flash drive, I used Infrarecorder again to make an image, and then used ‘dd’ on my MacBook Pro to write the image to a flash drive.

I’m going to do a fresh install, but booting it up and looking around at what’s already on there, OS X 10.4 on a single PowerPC cpu machine, not a dual, and only 800Mhz with 512MB, performance is not bad, it’s pretty responsive. Both Tiger and OS 9 boot pretty quick (Tiger boots a few seconds faster which is surprising).

Quick observations:

  • Safari on OS X is terribly slow, practically unusable
  • Ten Four Fox on OS X is usable but sluggish on scrolling any page. Makes you appreciate how fast modern day machines are
  • Classilla on OS 9 is pretty snappy. Of the browsing options available, this is the better choice on this machine so far.

Next up I’ll be trying to boot from the image of the 10.4 DVD and doing a fresh install. More to come later.