开发者

Skype Mac API - Use AppleScript or 5 year old API?

I have a x86_64 app that I would like to have optionally read Skype status messages. However, the 5 year old skype mac framework is 32-bit, and if there is a way t开发者_开发问答o have that compile within a 64-bit app, I haven't found it.

My question is, basically, how should I go about doing this? I really only need to get and set the USERSTATUS AWAY/ONLINE string.

Using AppleScript, a "Should Skype allow this" dialog pops up... every time. This is highly inefficient and downright irritating.

Advice?

I'm considering writing a 32-bit CLI wrapper, but that seems like overkill.


I used Notification Watcher to learn that Skype's API just works with NSDistributedNotifications. Repeating those notifications worked like a charm for a 64bit app.


Check out Scripting Bridge: Introduction to Scripting Bridge Programming Guide for Cocoa


If I remember right, the permission dialog does not come up once you allow permission.

I my Skype Apple Scripts I have to GUI to click them. If they come up.

tell application "Skype" to launch
delay 15
(* this part if the security API window comes up*)
tell application "System Events"
    tell application process "Skype"
        if exists (radio button "Allow this application to use Skype" of radio group 1 of window "Skype API Security") then
            click
            delay 0.5
            click button "OK" of window "Skype API Security"
        end if
    end tell
end tell
delay 5


I've found out that if you open "Skype.app" by viewing bundle contents -> Frameworks you'll find a 64bit and 32bit skype.framework


This is an answer in reply to a request from twitter. I used this code after asking this question way back when. I have not needed to look into the Skype API since this works just fine, but I imagine that its been updated since I last tried to use it. Anyhow...

Here's a list of the NSDistributedNotifications that I use when communicating to skype:

SKSkypeAPINotification

SKSkypeAttachResponse

SKSkypeBecameAvailable

SKAvailabilityUpdate

SKSkypeWillQuit

Just like any other kind of NSDistributedNotification, you simply register and process the results:

[[NSDistributedNotificationCenter defaultCenter]
     addObserver:self selector:@selector(setStatusAfterQuit:) 
     name:@"SKSkypeWillQuit"
     object:nil 
     suspensionBehavior:NSNotificationSuspensionBehaviorDeliverImmediately];

These are the iVars that I keep to sync with Skype:

NSString *applicationName;
NSString *mostRecentStatus;
NSString *mostRecentStatusMessage;
NSString *mostRecentUsername;
int APIClientID;
BOOL isConnected;
BOOL needToSetMessage;

NSString *nextMessage;
NSString *nextStatus;

Here's an example of how to connect to skype:

-(void) skypeConnect{
    if (!isConnected){
        [[NSDistributedNotificationCenter defaultCenter] postNotificationName:@"SKSkypeAPIAvailabilityRequest"                                                                     
                                                                       object:nil
                                                                     userInfo:nil        
                                                           deliverImmediately:YES];
        
        
        
        [[NSDistributedNotificationCenter defaultCenter] postNotificationName:@"SKSkypeAPIAttachRequest"
                                                                    object:applicationName
                                                                  userInfo:nil
                                                        deliverImmediately:YES];
    }
}

Here's an example of getting the status message (after you've registered with Skype):

    -(void) processNotification:(NSNotification *) note{
        if ([[note name] isEqualToString:@"SKSkypeAttachResponse"]){
            
            if([[[note userInfo] objectForKey:@"SKYPE_API_ATTACH_RESPONSE"] intValue] == 0){
                NSLog(@"Failed to connect to Skype.");
                isConnected = NO;
            }else {
                NSLog(@"Connected to Skype.");
                
                APIClientID = [[[note userInfo] objectForKey:@"SKYPE_API_ATTACH_RESPONSE"] intValue];
                isConnected = YES;
                
                [self sendCommand:@"GET PROFILE MOOD_TEXT"];
                
                
                if (needToSetMessage){
                    [self sendCommand:[NSString stringWithFormat:@"SET USERSTATUS %@",nextStatus]]; 
                    [self sendCommand:[NSString stringWithFormat:@"SET PROFILE MOOD_TEXT %@",nextMessage]];
                    needToSetMessage = NO;
                    nextMessage = @"";
                    nextStatus = @"";
                }
    
            }
        
        }
    }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜